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

推薦する

Linux サーバーが処理できる接続数をご存知ですか?

序文まず、TCP 接続を識別する方法を見てみましょう。システムは、(src_ip、src_port、...

CSS3 引用のソースと出典をマークする方法

疫病のせいで家にこもりきりで、頭がおかしくなりそうなので、パソコンを起動して頭を働かせてみました。今...

LNMP と phpMyAdmin を Docker にデプロイする方法

環境準備:複数のコンテナに基づいてホストに lnmp をデプロイします。 nginx サービス: 1...

HTML ページでギリシャ文字を使用する方法

ギリシャ文字は、特に数学や物理学などの科学技術分野で非常によく使用される記号列であり、特定の意味を持...

Ubuntu 18.04の下のディレクトリにディスクをマウントします

導入この記事では、Ubuntu 18.04 デスクトップ システムでディスクを目的のディレクトリにマ...

Linux Zabbixカスタム監視およびアラーム実装プロセスの分析

ターゲットzabbix フロントエンド監視の iostat コマンドでデータの 1 つを表示します。...

Vueはメニューナビゲーションを実装するためにelement-uiを使用します

この記事では、Element-uiを使用してメニューナビゲーションを実装するVueの具体的なコードを...

マークアップ言語 - 印刷スタイルシート

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...

OpenSSL は双方向認証のチュートリアルを実装します (サーバーとクライアントのコード付き)

1. 背景1.1 問題点最近の製品テスト レポートでは、PKI ベースの認証方法の使用が推奨されて...

ウェブページエクスペリエンス: 計画と設計

1. デザインの方向性を明確にする<br />まず、どのユーザーを対象にデザインするのか...

JavaScriptオブジェクト指向について学ぼう

目次JavaScript プロトタイプチェーンオブジェクトプロトタイプトップレベルのプロトタイプOb...

MySQL の instr を使用したファジー クエリ メソッドの紹介

MySQL の内部関数instrを使用すると、従来の like クエリ メソッドを置き換えることがで...

VMware ESXi のインストールと使用記録(ダウンロード付き)

目次1. ESXiをインストールする2. ESXiをセットアップする3. ESXiを起動するESXi...

露滴アニメーション効果を実装するための Three.js サンプル コード

序文みなさんこんにちは。CSS ウィザードの alphardex です。この記事では、three.j...

cobbler ベースの Linux システムを自動的にインストールする

1. コンポーネントをインストールする yum install epel-rpm-macros.no...