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を使ってシューティングゲームを作る方法

推薦する

CenterOS7 インストールおよび構成環境 jdk1.8 チュートリアル

1. まずcenterosに付属のJDKをアンインストールします rpm-qa|grepopenjd...

Centos7 に MySQL 8.0.23 をインストールする手順 (初心者レベル)

まず、MySQL とは何かを簡単に紹介します。簡単に言えば、データベースはデータを格納するための倉庫...

Vue3.0 手書き拡大鏡効果

達成される効果は、固定ズームが 2 倍になり、マウスが左側の画像領域に入るとマスク レイヤーが表示さ...

MySQLのインストールと設定方法のグラフィックチュートリアル(CentOS7)

1. システム環境[root@localhost ホーム]# cat /etc/redhat-re...

React 星評価コンポーネントの実装

要件は、製品の評価データを渡すことであり、ページには対応する星の数が表示されます。 1. 異なる評価...

CentOS7にJDK8をrpmモードでインストールする

CentOS 7が正常にインストールされると、OpenJDKのJREがデフォルトでインストールされて...

divの背景を透明に設定する方法の例

div の背景を透明にする一般的な方法は 2 つあります。 1. 不透明度属性を 0 ~ 1 の値に...

Dockerコンテナのデータを復元する方法

プロジェクトのテスト環境データベースのデータが失われてしまったので、記録しておきたいと思います。当時...

HTMLはマーキーを使用してテキストを左右にスクロールします

コードをコピーコードは次のとおりです。 <本文> //マーキーの助けを借りて<MA...

Vue3のサンドボックスの仕組みの詳しい説明

目次序文ブラウザコンパイル版ローカルプリコンパイルバージョン要約する序文vue3サンドボックスには主...

MySQL 5.7.10 インストール ドキュメント チュートリアル

1. 依存パッケージをインストールする yum -y インストール gcc-c++ ncurses-...

Vue+Openlayerはグラフィックスのドラッグと回転変形効果を実現します

目次序文関連資料成果を達成する実装手順序文Openlayer には独自の拡張プラグイン ol-ext...

MySQLインスタンスクラッシュ事例の詳細な分析

[問題の説明]私たちの実稼働環境には、複数の MySQL サーバー (MySQL 5.6.21) の...

クラウド CentOS で Docker リモート サービス リンクを有効にするための実装手順

ここでは、dockerがインストールされたcentosサーバーを紹介し、リモートリンクサービスを開始...

MYSQLが中国語を認識できない問題の恒久的な解決策

ほとんどの場合、MySQL はインストールしたばかりのときは中国語をサポートしません。これはエンコー...