web-dev-qa-db-ja.com

Nginxのフォルダーを拒否すると、PHP-FPMが優先されなくなります

タイトルにすべてが書かれていますが、非常に興味深い問題があり、かなり混乱しています。基本的に、私は単純なWordPressインストールを行っており、フォルダーを(フォルダー内のすべてのファイルとともに)拒否したいのですが、たとえば/ wp-content/themes/default/scriptsを許可しますが、特定のIP。

Nginxの第一人者が言うように、場所が_^~/wp-content/themes/default/scripts {deny all;}_のこのフォルダーを拒否できます。

しかし、私の理解では、「^」の方が優先され、正規表現の一致が見つかると、他のロケーションブロックの検索が停止します。すべての人のフォルダーを拒否したくないので(もちろん、allow (IP Address);を使用して、私の_^~/wp-content/..._ロケーションブロックはPHP-FPMロケーションブロックを完全に消し去り、ファイルをFastCGIサーバーに渡します。そしてもちろん、フォルダ内のファイルを表示しようとすると、PHPは解析していないため、PHPファイルは直接ダウンロードされます。

誰かアイデアがありますか?フォルダをブロックしたいのですが、許可することにしたユーザーに対してPHPが同時に機能するためには、かなり難しい質問です。問題に対する答えが見つかりません。

みんなありがとう!本当にあなたの助けに感謝します!

不思議に思う人のために、私の現在のNginx仮想ホスト構成は次のようになります:

_server {
    #..all of the common stuff you would expect

    include /folder/nginx.conf; #including some WordPress rewrites for W3 Total Cache

    # pass the PHP scripts to FastCGI server listening on UNIX socket
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
        fastcgi_read_timeout 1900;
    }

    location / {
        #allowing some IPs...

        #deny everyone else
        deny all;

        #WordPress rewrite for slugs
        index index.php;
        if (!-e $request_filename) {
            rewrite ^(.*)$  /index.php last;
        }

        #rewrite for sitemaps
        rewrite ^(.*/)?sitemap.xml /wp-content/sitemap.php last;

    }

    # denying access to .htaccess files
    location ~ /\.ht {
            deny  all;
    }
}
_
5
Taylor Jasko

ついに答えが見つかりました。このようなことをしているときは、PHP-FPM設定(location ~ \.php$ { (this code) }ブロックにあったすべてのもの)を再宣言する必要があります。

したがって、冗長性を回避するために、これらの値を別のファイルに入れて、次のようなものを残しました。

server {

        # pass the PHP scripts to FastCGI server listening on UNIX socket
        location ~ \.php$ {
                include /etc/nginx/fastcgi_php_text;
        }

        location / {
                index index.php;
        }

        location ^~/folder/ {
                deny all;
                allow ...;

                include /etc/nginx/fastcgi_php_text;
        }
}

これがそのようなための最良の方法であるかどうかはわかりませんが、これが私が理解した唯一の方法です。

3
Taylor Jasko

@ nameによるロケーションブロック を定義して参照することもできます。から nginxの落とし穴ページ

server {

        location ~ \.php$ {
            try_files      @fascgi;
        }

        location ^~ /folder {
            deny           all;
            allow          127.0.0.1;
            location ~ \.php$ {
                try_files  @fascgi;
            }
        }

        location @fascgi {
            fastcgi_pass   127.0.0.1:9000;
            include        fastcgi_params;
        }

}
1
DidThis