Nginx try_files ディレクティブの使用例

Nginx try_files ディレクティブの使用例

Nginx の設定構文は柔軟で、高度に制御可能です。バージョン 0.7 以降では、try_files ディレクティブが追加されました。名前付き場所と組み合わせることで、一般的に使用される書き換え構成メソッドを部分的に置き換え、解析効率を向上させることができます。

try_files ディレクティブの説明

try_files ディレクティブの構文は次のとおりです: try_files file ... uri または try_files file ... = code
デフォルト: なし スコープ: サーバーの場所

その機能は、ファイルが順番に存在するかどうかを確認し、見つかった最初のファイルまたはフォルダーを返すことです (末尾のスラッシュはフォルダーを示します)。すべてのファイルまたはフォルダーが見つからない場合は、最後のパラメーターへの内部リダイレクトが実行されます。

最後のパラメータのみが内部リダイレクトを引き起こすことができ、それ以前のパラメータは内部 URI のみを設定することに注意してください。最後のパラメータはフォールバック URI であり、存在する必要があります。存在しない場合は、内部 500 エラーが発生します。名前付きの場所を最後の引数として使用することもできます。書き換えディレクティブとは異なり、フォールバック URI が名前付きの場所でない場合、$args は自動的には保持されません。$args を保持する場合は、明示的に指定する必要があります。

try_files $uri $uri/ /index.php?q=$uri&$args;

分析例

例1

try_files はリストしたファイルを試行し、内部ファイル ポインターを設定します。

例えば:

try_files /app/cache/ $uri @fallback; 
インデックス index.php index.html;

$document_root/app/cache/index.php、$document_root/app/cache/index.html、および $document_root$uri が存在するかどうかを検出します。存在しない場合は、内部的に @fallback (@ は構成ファイル内の定義済みマークアップ ポイントを示します) にリダイレクトされます。

最後のパラメータとしてファイルまたはステータス コード (=404) を使用することもできます。最後のパラメータがファイルの場合、そのファイルが存在している必要があります。

例2

例えば、nginxはPHPファイルを解析せず、テキストコードを返します。

try_files $uri /cache.php @fallback;

このディレクティブは、内部ファイルを $document_root/cache.php を指すように設定して返しますが、内部リダイレクトは発生しないため、場所セグメントは処理されず、テキストが返されます。

(index ディレクティブを追加すると、index が内部リダイレクトをトリガーするため、PHP を解析できます)

例3

変数へジャンプ

サーバー{
 8000を聴く;
 サーバー名 192.168.119.100;
 ルートhtml;
 インデックス index.html index.php;
 
 場所 /abc {
   try_files /4.html /5.html @qwe; #ファイル 4.html と 5.html をチェックします。存在する場合は通常どおり表示されます。存在しない場合は、@qwe 値を探します}

 場所 @qwe
  書き換え ^/(.*)$ http://www.baidu.com; #Baidu ページにジャンプ}

例4

指定したファイルにジャンプ

サーバー{
  8000を聴く;
  サーバー名 192.168.119.100;
  ルートhtml;
  インデックス index.php index.html;

  場所 /abc {
    try_files /4.html /5.html /6.html;
 }

例5

リクエストをバックエンドにリダイレクトする

上流竜巻{
    サーバー 127.0.0.1:8001;
}
 
サーバー{
    サーバー名 imike.me;
    301 $scheme://www.imike.me$request_uri を返します。
}
 
サーバー{
    聞く 80;
    サーバー名 www.imike.me;
 
    ルート /var/www/www.imike.me/V0.3/www;
    インデックス index.html index.htm;
 
    try_files $uri @tornado;
 
    場所 @tornado {
        proxy_pass_header サーバー;
        proxy_set_header ホスト $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Xスキーム $scheme;
 
        proxy_pass http://tornado;
    }
}

よくある間違い

よくある間違い 1

try_files は、ファイルが存在するかどうかを順番にチェックし、最初に見つかったファイルを返します。少なくとも 2 つのパラメータが必要ですが、最後のパラメータは内部リダイレクトであり、rewrite と同じ効果があります。前の値は、$document_root を基準としたファイル パスです。つまり、パラメータには異なる意味があり、最後のパラメータとしてステータス コード (404) を使用することもできます。注意しないと、無限ループが発生し、500 エラーが発生します。

場所 ~.*\.(gif|jpg|jpeg|png)$ {
    ルート /web/wwwroot;
    try_files /static/$uri $uri;
}

本来の意図は、upload/2022/web/test.jpg にアクセスするときに、/web/wwwroot/static/test.jpg が存在するかどうかを確認することです。存在しない場合は、/web/wwwroot/test.jpg にアクセスします。

ただし、最後のパラメータは内部リダイレクトであるため、/web/wwwroot/test.jpg が存在するかどうかはチェックされません。最初のパスが存在しない限り、この場所に再度入り、無限ループが発生します。結果は500内部サーバーエラーです

場所 ~.*\.(gif|jpg|jpeg|png)$ {
    ルート /web/wwwroot;
    try_files /static/$uri $uri 404;
}

この方法では、まず /web/wwwroot/static/test.jpg が存在するかどうかを確認します。存在しない場合は、/web/wwwroot/test.jpg を取得します。存在しない場合は、404 not found を返します。

よくある間違い 2

Nginx try_files $query_string が空の場合の解決策

サーバー{
  聞く 80;
  サーバー名 localhost.dev;
  インデックス index.php index.html index.htm;
  $root_path を '/var/www/phalcon/public' に設定します。 
  ルート $root_path;
  位置 / {
    try_files $uri $uri/ /index.php;
  }
  場所 ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    127.0.0.1:9000; をデフォルトとして設定します。
    fastcgi_index インデックス.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_params を含めます。
  }
  場所 ~* ^/(css|img|js|flv|swf|download)/(.+)$ {
    ルート $root_path;
  }
  場所 ~ /\.ht {
    すべてを否定する;
  }
}

PHPが$_GET情報を取得できないことが判明

try_files $uri $uri/ /index.php;

変更する

try_files $uri $uri/ /index.php?$query_string;

問題は解決できます。以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、皆様が123WORDPRESS.COMを応援していただければ幸いです。

以下もご興味があるかもしれません:
  • nginx try_files ディレクティブはファイルが存在するかどうかを判定します

<<:  MySQLとElasticsearch間のデータ非対称性問題の解決策

>>:  CocosCreatorを使ってシューティングゲームを作る方法

推薦する

Dockerイメージ作成の完全なプロセス

目次序文作成手順CentOSベースイメージを作成するコンテナを作成してカスタマイズするカスタムコンテ...

MySQL の current_timestamp の落とし穴とその解決策を共有する

目次MySQL の current_timestamp の落とし穴エラーを報告する私の解決策mysq...

MySql ストアド プロシージャ パラメータの初歩的な使用法の詳細な説明

パラメータでのストアドプロシージャの使用IN パラメータは、プロシージャに情報を渡すためにのみ使用さ...

MySQL SQL 最適化チュートリアル: IN クエリと RANGE クエリ

まず、in() クエリについて説明します。 「High Performance MySQL」では、イ...

ウェブページ作成のヒントのまとめ

序文この記事は主に、日常の Web ページ制作で遭遇する問題解決スキルの一部をまとめ、皆さんの参考と...

InnoDB テーブルの BLOB 列と TEXT 列のストレージ効率を最適化します。

まず、MySQL InnoDB エンジンのストレージ形式に関する重要なポイントをいくつか紹介します。...

CSS を使用して半透明の背景と不透明なテキストを実現する例

この記事では、CSS を使用して半透明の背景と不透明なテキストの効果を実現する方法の例を紹介します。...

ネイティブJSで禁止すべきメソッドの記述

目次ブロックレベル関数オブジェクトのプロトタイプを直接変更すると呼び出された人発信者評価ブロックレベ...

docker を使用して複数のネットワーク インターフェースを持つコンテナーを起動する方法の例

コンテナにネットワークインターフェースを追加する1 デフォルトのネットワークモードでコンテナを実行す...

Linux/Docker で System.Drawing.Common を使用する

序文プロジェクトを .net core に移行した後、 System.Drawing.Commonコ...

HTML の ReadOnly と Enabled の違い

ReadOnly 属性を持つ TextBox は、クライアント上で次のマークアップとして表示されます...

JavaScriptの強力な演算子をいくつか見てみましょう

目次序文1. ヌル合体演算子2. ??= 空代入演算子3. ?. オプション連鎖演算子4. ?: 三...

VMware Workstation16 と Navicat リモート接続での Centos7 での MySQL8.0 インストール プロセス

目次1. CentOS7+MySQL8.0、yumソースインストール2. MySQLにログインしてパ...

LinuxシステムにDockerをインストールするプロセス

このブログでは、Docker をインストールするプロセスを簡単な手順で説明します。Docker のイ...

アイデアを war パッケージにパッケージ化し、tomcat にデプロイしてアクセス パスの問題 (図とテキスト)

Web プロジェクトを war にパッケージ化するアイデアにとって最も重要なことは、アトリフィカを...