Ubuntu

改寫後nginx不使用php-fastcgi

  • June 1, 2013

我在 nginx 重寫時遇到問題。我想重寫^(.*?)/(.*?)/?$controllers/$1.php?action=$2. 這在之前的 Apache 伺服器上對我有用。之後,我想將該文件路由到 php-fastcgi。

對於正常請求(即,當我輸入完整路徑時,不使用重寫),php-fastcgi 可以正常工作。

我的配置:

server {
   listen [::]:80;

   root            /var/www/my-dir;
   index           index.php index.html index.htm;
   charset         utf-8;

   server_name         my-domain;

   location / {
       autoindex   off;
       rewrite     ^(.*?)/(.*?)/?$ controllers/$1.php?action=$2 last;
   }

   location ~ \.php$ {
       fastcgi_split_path_info ^(.+\.php)(/.+)$;
       fastcgi_pass    127.0.0.1:9000;
       fastcgi_index   index.php;
       include     fastcgi_params;
   }

   location ~ /\. {
       deny        all;
   }
}

在編輯了這個配置之後,我service nginx restart當然做了一個。

由於某種原因,php-fastcgi 的位置塊在重寫後沒有使用。為什麼會這樣以及如何解決?

相反,我收到“未指定輸入文件”作為響應。在錯誤日誌中,我看到:

2013/06/01 19:00:25 [error] 14288#0: *1 access forbidden by rule, client: xxx, server: my-domain, request: "GET /user/create HTTP/1.1", host: "my-domain"

你缺少一個try_files.

location / {
   try_files $uri $uri/ /index.php;
   # ....everything else
}

您可能還會遇到問題,因為相對 URL 的開頭rewrite沒有 a 。嘗試將其更改為./``controllers/$1.php...``/controllers/$1.php...

而且,您缺少告訴 php-fpm 在哪裡可以找到 PHP 腳本的 fastcgi 參數。將此添加到location ~ \.php$塊中。

fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

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