我有一个如下所示的位置块:
root /var/www/ProjectP;
location /p/ {
index index.php;
try_files $uri $uri/ =404;
}
location ~ /p/.*\.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
为了实现这一点,我创建了一个目录/var/www/ProjectP/p/
,这是一个糟糕的黑客行为,因为它将项目在 http 空间中的位置信息与项目一起提供,而不是与 nginx 一起提供。Nginx 配置应该能够将其移动到而/pp/
无需修改项目 P。
这个特定的项目没有proxy_pass
指令,但接下来会发生这种情况,然后我的黑客就不太可能奏效。
我确信 nginx 有正确的方法来处理如此常见的问题,但我还没有找到。有什么建议吗?
更新 1
正如@RichardSmith所说,正确的方法肯定是别名指令。在静态内容上测试这个效果很好:
location /a/ {
alias /var/www/ProjectA/;
index index.html;
try_files $uri $uri/ =404;
}
当我对 php 代码执行相同操作时,我获得了一半的成功:
location /p/ {
alias /var/www/ProjectP/;
index index.php;
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ /p/(.+\.php)$ {
alias /var/www/ProjectP/$1;
include snippets/fastcgi-php.conf;
# With php7.0-fpm:
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
## These next are largely set via snippets/fastcgi-php.conf.
## Trying them here doesn't help, but I leave them (commented out)
## for the moment...
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#include fastcgi_params;
#fastcgi_param SCRIPT_FILENAME $uri;
}
针对非 php 文件进行测试,我确认第一个块可以工作。但第二个块不行,因此 php 文件无法正常使用。(我得到 404。)我尝试了最后注释掉的 fastcgi 指令的几个变体,但显然不是正确的组合。
更新 2
这有效。
root /var/www/;
location /p/ {
alias /var/www/ProjectP/;
index index.php;
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
# Pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php7.0-fpm:
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
}
答案1
您的区块至少存在一个问题location
。
如果您要求http://www.example.com/p/test.php
,变量的内容$1
将是test.php
。
这意味着你的
alias /var/www/ProjectP/$1;
将使文档根目录为/var/www/ProjectP/test.php
。
然后,
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
定义发送给 PHP 进程来定位文件的实际文件路径。$document_root
包含alias
此转换中的路径,并$fastcgi_script_name
包含来自请求的文件名。
因此,您这种情况的最终结果是,请求http://www.example.com/p/test.php
最终到达 PHP 进程的文件名/var/www/ProjectP/test.phptest.php
。因此将返回404
。
解决方法是使用:
alias /var/www/ProjectP
在 PHPlocation
块中。
答案2
这有效。
root /var/www/;
location /p/ {
alias /var/www/ProjectP/;
index index.php;
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
# Pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php7.0-fpm:
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
}