我全新安装了 Ubuntu 14.04 服务器。我已经安装了 nginx、php 等...
server {
listen 80;
listen [::]:80;
server_name testone.local;
root /var/www/htmlone;
index index.html;
# pass the PHP scripts to FastCGI server listening on the php-fpm socket
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location /alias {
alias /var/www/htmlalias;
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
如果我在 中使用一个简单的 php 脚本,/var/www/htmlone
php 会按预期执行。如果我在 中使用相同的脚本,它/var/www/htmlalias
不会按预期执行。但如果我在 中放入 HTML 脚本,它会/var/www/htmlalias
按预期显示,因此别名充当别名,但不执行 php 文件,但 php 在主根目录中工作。
我发现许多 serverfault 问题都说这个常规设置应该可以工作,但实际上却不行。有人发现我可能做错了什么吗?我在错误日志中没有看到任何消息。
我应该补充一下,这是针对 nginx 版本的:nginx/1.8.0
答案1
你遇到的问题实际上是三年前提交的长期存在的错误这导致alias
和try_files
无法真正一起工作。
在错误页面上有一个Luke Howell 的解决方法,具体如下:
location /api { ## URL string to use for api ##
alias /home/api/site_files/; ## Site root for api code ##
## Check for file existing and if there, stop ##
if (-f $request_filename) {
break;
}
## Check for file existing and if there, stop ##
if (-d $request_filename) {
break;
}
## If we get here then there is no file or directory matching request_filename ##
rewrite (.*) /api/index.php?$query_string;
## Normal php block for processing ##
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
但请注意,就 nginx 而言,如果是邪恶的应尽可能避免。
答案2
从我对上述配置的测试来看,存在
try_files $uri =404;
在导致问题的嵌套别名 php 位置内。有了它,nginx 会检查“/var/www/htmlalias/alias/index.php”(请注意添加了“别名”和 uri),发现它不存在,然后返回 404。删除 try_files 会首先停止在磁盘上查找此文件,并将请求直接传递给 fastcgi,然后 fastcgi 会从 SCRIPT_FILENAME 中找到正确的文件。
如果您希望不存在的 PHP 文件出现 404 而不是 PHP 错误,则可执行以下操作:
location /alias {
alias /var/www/htmlalias;
location ~ /([^/]+\.php)$ {
try_files /$1 =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
首先,正则表达式捕获 php 文件的填充文件名(例如 foo.php)作为 $1。然后,try_files 相对于当前别名检查该文件是否存在,如果不存在则返回 404。
然后,我们必须通过在包含之后重新定义它来覆盖 fastcgi_params 中定义的默认 SCRIPT_FILENAME,因为 $request_filename 出于某种我无法理解的原因,完全是错误的东西(字面意思是 /index.php)。
答案3
这是我解决问题的方法:
在您的示例中,默认服务器配置(无别名):
server {
listen 80;
listen [::]:80;
server_name testone.local;
root /var/www/htmlone;
index index.html;
# pass the PHP scripts to FastCGI server listening on the php-fpm socket
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
并从命令行在下方创建一个符号链接/var/www/htmlone
:
ln -s /var/www/htmlalias /var/www/htmlone/alias