5

nginx と CodeIgniter を使用して、次のようにプロジェクトのルーティングを処理するサーバー構成にロケーション ブロックがあります。

location /beta/ {
    try_files $uri $uri/ /beta/index.php;
}

これは問題なく動作しますが、この CodeIgniter プロジェクトでバックアップを実行し、それらを別のフォルダーに移動します。「ベータ」プロジェクトの名前が変更されます (タイムスタンプ付き)。したがって、次のような名前の CodeIgniter プロジェクトを含むバックアップ フォルダーがあります。

backups/beta_2013_05_21_0857
backups/beta_2012_05_23_0750

私がやろうとしているのは、これらの変数名のプロジェクトを処理する別のロケーション ルールを作成することですが、これまで正規表現を使用する試みはすべて失敗しています。プロジェクトに直接名前を付けると、機能します。

location /backups/beta_2013_05_21_0857 {
    try_files $uri $uri/ /backups/beta_2013_05_21_0857/index.php;
}

しかし、明らかに、すべてのフォルダーごとにルールを作成したくありません。誰でもこれを解決する方法について何か考えがありますか? これは私が問題を解決しようとしていた方法です:

location /backups/^\w+$/ {
    try_files $uri $uri/ /backups/$1/index.php;
}
4

1 に答える 1

8

考えられる 2 つの問題:

  1. 正規表現に括弧がないため、キャプチャ グループにはなりません。そして、Nginx に正規表現の一致を行うように指示する ~* コマンドを見逃していました。

    location ~* ^/backups/(\w+)$ {
        try_files $uri $uri/ /backups/$1/index.php;
    }
    
  2. try_files の最後のパラメーターはマジックです。実際にファイルが存在するかどうかを確認しようとはしません。代わりに、リクエスト URI を最後のパラメーターで書き換えて、リクエストを再処理しますが、これはやや驚くべきことです。これを修正するには、404 またはその他のページにフォールバックできます (フォールバックする必要があります)。

    location ~* ^/backups/(\w+)$ {
        try_files $uri $uri/ /backups/$1/index.php /404_static.html; 
    }
    
    location = /404_static.html {
        root   /documents/projects/intahwebz/intahwebz/data/html/;
        internal;
    }
    

ところで、さらに問題がある場合は、有効rewrite_log on;にする必要があります。これにより、一致が通知レベルでサーバーのエラー ファイルに書き込まれ、場所の一致の問題を把握するのに役立ちます。

于 2013-05-24T00:53:46.710 に答える