5

特定の場所から 1 つのファイルを除外するにはどうすればよいですか? 次のブロックは、PHP 処理をグローバルに処理します。

location ~ \.php$  {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass   unix:/var/run/php5-fpm.sock;
    fastcgi_read_timeout 150;
    fastcgi_index index.php;
    include fastcgi_params;
}

ここでやりたいことは、piwik.php という 1 つのファイルを除外することです。これは、別の場所で特別な扱いを受ける必要があるためです。だから私の目標は、このように少し見えるようにすることです

location ~ \.php$ && NOT /stats/piwik.php  {
    ...
}

これはどのように達成できますか?

4

1 に答える 1

4

答えを見ると、あなたは自分自身を蹴るつもりです。

ここでやりたいことは、piwik.php という 1 つのファイルを除外することです。これは、別の場所で特別な扱いを受ける必要があるためです。

OK、そのパスをデフォルトの場所の前に別の場所として設定する必要があります。例えば

location ~ ^/stats/piwik.php$ {
    allow 127.0.0.1;
    deny all;

    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass   unix:/var/run/php5-fpm.sock;
    fastcgi_read_timeout 150;
    fastcgi_index index.php;
    include fastcgi_params;
}

location ~ \.php$  {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass   unix:/var/run/php5-fpm.sock;
    fastcgi_read_timeout 150;
    fastcgi_index index.php;
    include fastcgi_params;
}

これらはどちらも正規表現のロケーション ブロックであるため、一致する Nginx conf の最初にリストされているブロックが優先されます。

ただし、おそらくそのディレクトリ全体を保護する必要があります。これは、一致するプレフィックスの場所の規則を使用することで、さらに簡単に実行できます。

location ^~ /stats/ {
    allow 127.0.0.1;
    deny all;

    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass   unix:/var/run/php5-fpm.sock;
    fastcgi_read_timeout 150;
    fastcgi_index index.php;
    include fastcgi_params;
}

location ~ \.php$  {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass   unix:/var/run/php5-fpm.sock;
    fastcgi_read_timeout 150;
    fastcgi_index index.php;
    include fastcgi_params;
}

一致するプレフィックスは正規表現が一致するよりも優先度が高いため、nginx conf での順序は問題になりません。マッチの優先順位の良い説明はこちら

于 2013-08-22T19:46:43.570 に答える