你好,我想按照自己的想法设置 nginx。我读了很多手册(包括官方手册),但还是无法让它按我预期的方式工作。
我有以下 URL:/user/register、/user/login、/user/logout 等...没有任何带有 php 文件的 URL。
因此,我想将所有非真实文件 URL 传递到 fast-cgi 服务器。顺便说一句,fpm 在 chroot 中工作。
这是我的配置文件:
server {
listen 80; ## listen for ipv4
server_name domain;
root /var/www/domain/htdocs;
include /etc/nginx/security;
fastcgi_read_timeout 6000;
location / {
try_files $uri $uri/ @php-fpm;
}
location @php-fpm {
fastcgi_pass unix:/tmp/php5-fpm.sock;
include /etc/nginx/fastcgi_params;
fastcgi_param DOCUMENT_ROOT /htdocs;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
}
}
在 nginx 日志中我看到:
- - [31/May/2012:16:02:12 +0300] "GET /user/register HTTP/1.1" 403 46 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.46 Safari/536.5"
在 fpm 日志中下一步:
- - 31/May/2012:13:02:12 +0000GET /user/register403 /var/www/domain/htdocs/user/register 0.215 512 0.00%
我有 Ubuntu 12.04 和 nginx 1.1.19
PS 在屏幕上(在浏览器中)我只看到文本“未指定输入文件”。
答案1
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
因此,您可以在日志中看到您配置的内容。您可能想要类似以下内容的内容:
fastcgi_param SCRIPT_FILENAME /path/to/your/script.php;
答案2
您配置错误try_files
。正如您在 php-fpm 日志中看到的那样,确切的 URL 被传递给 PHP 服务器,然后服务器尝试获取具有该名称的文件,但该文件当然不存在。
您需要做的是重写或仅更改传递的文件,然后在该脚本中处理给定的 url。
改编自我的 nginx 配置:
try_files $uri $uri/ index.php;
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/tmp/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
此配置会将所有 .php 文件转发到 php_fpm。如果您不希望 .php 文件直接访问,则需要使用内部的,这会将它们向外界隐藏起来,但大多数情况下你不需要这样做。
使用此配置,所有请求都将转发到index.php
。要提取有关用户想要查看的页面的数据,请查看 PHP 的$_SERVER['REQUEST_URI']
。如果您要通过该字符串展开/
,请记住第一个数组条目将为空。