Nginx
Nginx 沒有將請求傳遞給 PHP
這與我多年前在 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。