我有一个看起来像这样的位置块:
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/
,这是一个可怕的 hack,因为它提供了项目在 http 空间中的位置的知识,而不是 nginx。Nginx 配置应该能够在/pp/
不修改项目 P的情况下将其移动到。
这个特定的项目没有proxy_pass
指令,但接下来会发生,然后我的 hack 不太可能奏效。
我确信 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;
}
}
这行得通。
location
您的区块至少存在一个问题。如果您要求
http://www.example.com/p/test.php
,$1
变量的内容将为test.php
.这意味着您的
将使文档根目录变为
/var/www/ProjectP/test.php
.然后,
定义发送到 PHP 进程以定位文件的实际文件路径。
$document_root
包含此alias
转换中的路径,并$fastcgi_script_name
包含来自请求的文件名。因此,在您的情况下,最终结果是请求
http://www.example.com/p/test.php
最终成为/var/www/ProjectP/test.phptest.php
PHP 进程的文件名。因此会有404
退货。解决方法是只使用:
在 PHP
location
块中。