Nginx

Nginx 沒有將請求傳遞給 PHP

  • June 12, 2016

這與我多年前在 SO 上提出的一個老問題有關,對此我從未得到正確答案。我只是設置了一個新伺服器(Ubuntu 16.04,Nginx 1.10,PHP 7)並回到這個。

我有一個在子文件夾中執行的 Question2Answer 實例,其他 PHP 程式碼從根目錄執行。對於根目錄,我的伺服器塊中有這個:

location / {
   try_files $uri $uri/ /index.php?$request_uri;
}

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

對於 Q2A,我在舊伺服器上的內容是:

location /qa/ {
   if (!-e $request_filename) {
       rewrite ^/qa/(.*)$ /qa/index.php?qa-rewrite=$1 last;
   }
}

這確實有效,但我不認為應該這樣做(如果是邪惡的,等等)。我確信它必須只能使用try_files. 我試過這個:

location /qa/ {
   try_files $uri $uri/ /qa/index.php?qa-rewrite=$uri&$args;
}

但它不起作用,因為/qa/傳入qa-rewrite. 它應該只通過路徑中的所有內容。有沒有辦法/qa/$uri變數中刪除?

我也試過這個:

location ~ ^/qa/(.*) {
   try_files $uri $uri/ /qa/index.php?qa-rewrite=$1;
}

但這反而會開始下載 PHP 程式碼index.php!如何讓它傳遞給 PHP 引擎?

如果邪惡的,但正如文件所述rewrite ... last聲明是可以的。

但是,另一種方法(仍然只提取 的一部分)是在語句$uri末尾使用命名位置:try_files

location /qa/ {
   try_files $uri $uri/ @qa;
}
location @qa {
   rewrite ^/qa/(.*)$ /qa/index.php?qa-rewrite=$1 last;
}

正則表達式定位方法也是有效的。但是正則表達式位置的評估與前綴位置不同。您需要將塊放在塊location ~ \.php$上方**,**location ~ ^/qa/(.*)以便以.php正確的位置處理以結尾的 URI。

引用自:https://serverfault.com/questions/783444