nginx の場所正規表現変数が try_file で動作しない

nginx の場所正規表現変数が try_file で動作しない

ステージング WordPress サイトでフォルダーを作成および削除したいサイトがあります。

構造は次のようになります。

/wp1
/wp2
/wp3
/...

私は nginx を使用していますが、これを機能させるには、各 WordPress サイトをキャプチャするために複数のロケーション ブロックを作成する必要があることを認識しています。

location /wp1 {
    try_files $uri $uri/ /wp1/index.php?$args;
}
location /wp2 {
    try_files $uri $uri/ /wp2/index.php?$args;
}
location /wp3 {
    try_files $uri $uri/ /wp3/index.php?$args;
}
...

この設定は完璧に機能しますが、維持するのが難しいため、すべてのサイトで 1 つの場所ブロックのみを使用するために場所を指定した正規表現を試しました。これにより、nginx の設定を気にせずにフォルダーを削除および作成できるようになります。

location ~ ^/wp(?<staging>\d+) {
    try_files $uri $uri/ /wp$staging/index.php?$args;
}

しかし、これは機能しません。何が足りないのでしょうか?

これは私の完全な設定ファイルです:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    root /home/city/sites/staging1/html;
    index index.php;
    location = /favicon.ico {
            log_not_found off;
            access_log off;
    }
    location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
    }
    location / {
            try_files $uri $uri/ /index.php?$args;
    }
    location ~ ^/stg(?<staging>\d+) {
            try_files $uri $uri/ /stg$staging/index.php?$args;
    }
    location ~ \.php$ {
            include fastcgi.conf;
            fastcgi_intercept_errors on;
            fastcgi_pass unix:/run/php/php7.0-fpm.city.sock;
    }
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
            expires max;
            log_not_found off;
    }
}

これは、curl -I http://ipaddress/wp2

HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Tue, 17 Jan 2017 03:45:43 GMT
Content-Type: text/html
Content-Length: 178
Location: http://ipaddress/wp2/
Connection: keep-alive

これは、curl -I http://ipaddress/wp2/

HTTP/1.1 200 OK
Server: nginx
Date: Tue, 17 Jan 2017 03:45:49 GMT
Content-Type: application/octet-stream
Content-Length: 418
Last-Modified: Wed, 25 Sep 2013 00:18:11 GMT
Connection: keep-alive
ETag: "52422bc3-1a2"
Accept-Ranges: bytes

しかし、これにより index.php wordpress ファイルがダウンロードされ、コンテンツ タイプはapplication/octet-stream取得すべきものではありません。

これは、正規表現の場所ブロックのない、単純な WordPress サイトの予想される curl 出力です。

HTTP/1.1 200 OK
Server: nginx
Date: Tue, 17 Jan 2017 04:30:30 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Link: <http://ipaddress/wp2/wp-json/>; rel="https://api.w.org/"
Link: <http://ipaddress/wp2/>; rel=shortlink 

nginx ログ ファイルでは、正規表現の場所が使用されていることがわかりますが、何が問題なのか、なぜその応答が返されるのかわかりません。

[debug] 24359#24359: *1330 test location: "/"
[debug] 24359#24359: *1330 test location: "favicon.ico"
[debug] 24359#24359: *1330 test location: "robots.txt"
[debug] 24359#24359: *1330 test location: ~ "^/wp(?<staging>\d+)"
[debug] 24359#24359: *1330 http regex set $staging to "2"
[debug] 24359#24359: *1330 using configuration "^/wp(?<staging>\d+)"
[debug] 24359#24359: *1330 http cl:-1 max:1048576
[debug] 24359#24359: *1330 rewrite phase: 3
[debug] 24359#24359: *1330 post rewrite phase: 4
[debug] 24359#24359: *1330 generic phase: 5
[debug] 24359#24359: *1330 generic phase: 6
[debug] 24359#24359: *1330 generic phase: 7
[debug] 24359#24359: *1330 access phase: 8
[debug] 24359#24359: *1330 access phase: 9
[debug] 24359#24359: *1330 access phase: 10
[debug] 24359#24359: *1330 post access phase: 11
[debug] 24359#24359: *1330 try files phase: 12
[debug] 24359#24359: *1330 http script var: "/wp2"
[debug] 24359#24359: *1330 trying to use file: "/wp2" "/home/city/sites/staging1/html/wp2"
[debug] 24359#24359: *1330 http script var: "/wp2"
[debug] 24359#24359: *1330 trying to use dir: "/wp2" "/home/city/sites/staging1/html/wp2"
[debug] 24359#24359: *1330 try file uri: "/wp2"
[debug] 24359#24359: *1330 content phase: 13
[debug] 24359#24359: *1330 content phase: 14
[debug] 24359#24359: *1330 content phase: 15
[debug] 24359#24359: *1330 content phase: 16
[debug] 24359#24359: *1330 content phase: 17
[debug] 24359#24359: *1330 http filename: "/home/city/sites/staging1/html/wp2"

答え1

問題は、PHP が実行されておらず、ダウンロードされているだけであると思われます。

あなたのコメントに従って、あなた自身の回答、この回答へのコメント、または質問の編集のいずれかで解決策を説明する必要があります。評判の数値が低いユーザーにとっては、物事が少し制限されていると思います。

答え2

問題は、正規表現の場所が以下を使用していなかったことです。

location ~ \.php$ {
    include fastcgi.conf;
    fastcgi_intercept_errors on;
    fastcgi_pass unix:/run/php/php7.0-fpm.city.sock;
}

つまり、php ファイルが実行されていなかったのです。

この問題を解決するには、location ~ \.php$問題のある正規表現の場所に を追加するだけです:

location ~ ^/stg_(?<staging>\w+) {
    try_files $uri $uri/ /stg_$staging/index.php?$args;
    location ~ \.php$ {
        include fastcgi.conf;
        fastcgi_intercept_errors on;
        fastcgi_pass unix:/run/php/php7.0-fpm.city.sock;
    }
}

関連情報