2016-06-18 1 views
2

previous question,では、Nginxで.htpasswdとregexを使用して/ admin /サブフォルダディレクトリをパスワードで保護しようとしていました。NginxはPHPファイルを正常に保護しますが、ダウンロードするように促します

パスワード認証が完了した後、NginxはPHPファイルを単にダウンロードするのではなく、「ダウンロード」するように促します。

これは、新しいロケーションの「認証」ブロックがコメントアウトされている場合には発生しません。たとえば、このコードサンプルでは、​​PHPページはいかなる問題なくロード:

location/{ 
      try_files $uri $uri/ =404; 
    } 

    #location "~^/admin/.*$" { 
    #  try_files $uri $uri/ =404; 
    #  auth_basic "Restricted"; 
    #  auth_basic_user_file /etc/nginx/.htpasswd; 
    #} 

    location ~ \.php$ { 
      try_files $uri =404; 
      fastcgi_split_path_info ^(.+\.php)(/.+)$; 
      fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; 
      fastcgi_index index.php; 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      include fastcgi_params; 
    } 

は、どのように私はこれらの(明らかに矛盾する)場所のブロック、そう/管理/セクションを解決することができ、まだパスワードで保護されているPHPファイルがまだロード?

答えて

3

問題は、how nginx processes a requestについての基本的な誤解です。基本的には、nginxは要求を処理するために1つの場所を選択します。

は、auth_basicを必要とするロケーションブロック内の/adminで始まるURIを処理します。さらに、.phpで終わるURIをPHP7に送る必要があります。

したがって、通常のPHPファイルを処理するFastCgiブロックと制限付きのPHPファイルを処理するFastCgiブロックが2つ必要です。

location directiveにはいくつかの形式があります。正規表現の場所が指定されているので、location "~^/admin/.*$"ブロックは、location ~ \.php$ブロックが/adminで始まり、.phpで終わるURIを参照できないようにします。 location ^~プレフィックスの場所ではなく、正規表現である

location/{ 
    try_files $uri $uri/ =404; 
} 

location ~ \.php$ { 
    try_files $uri =404; 

    include fastcgi_params; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; 
} 

location ^~ /admin/ { 
    auth_basic "Restricted"; 
    auth_basic_user_file /etc/nginx/.htpasswd; 

    try_files $uri $uri/ =404; 

    location ~ \.php$ { 
     try_files $uri =404; 

     include fastcgi_params; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; 
    } 
} 

注こと:

きれいな解決策は、ネストされた場所のブロックを使用し、正規表現の場所よりも優先するために、プレフィックスの場所を強制^~修飾子を使用することだろうロケーション。

location ~ \.php$ブロックにfastcgi_split_path_infoとディレクティブは不要です。

+1

私のために働きます。ページがサーバーから来ており、ブラウザのキャッシュから古いコピーではないと確信していますか?アクセスログを確認してください。 –

+0

あなたはそうだと思いますが、私はプライベートモードになっていました。 about:config内のすべてのキャッシングを無効にして、今は完全に動作しています。素晴らしいソリューションをありがとう。 – some1

関連する問題