我在 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"
答案1
你缺少了try_files
。
location / {
try_files $uri $uri/ /index.php;
# ....everything else
}
您可能还会遇到问题,因为相对 URL 的开头rewrite
没有。请尝试将其更改为。/
controllers/$1.php...
/controllers/$1.php...
而且,您缺少一个 fastcgi 参数,该参数告诉 php-fpm 在哪里找到 PHP 脚本。将其添加到location ~ \.php$
块中。
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;