我正在尝试配置 Nginx 以在同一域中的两个不同目录中托管多个基于 PHP 的应用程序。我试图获得的结果是:
http://webserver.local/ > 应用程序来自/path/to/website
http://webserver.local/app > 应用程序来自/path/to/php-app
这是我的配置。
- 当我点击时,一切正常(PHP 和非 PHP 资源)http://webserver.local/。
- 但是,当我访问http://webserver.local/app/index.php。我明白了
File Not Found
(但是,文件在/path/to/php-app/index.php
)。 - 我创建了一个文件
/path/to/php-app/test.txt
(不是 PHP 的),然后当我转到http://webserver.local/app/test.txt,我得到了预期的文本文件。
有人能帮我解释一下我错在哪里吗?谢谢 :)
server {
listen 80;
server_name webserver.local;
location / {
root /path/to/website;
index index.php;
location ~ \.php$ {
root /path/to/website;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
location ^~ /app {
alias /path/to/php-app;
index index.php;
location ~ \.php$ {
root /path/to/php-app;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
答案1
嵌套location ~ \.php$
块将找不到 PHP 脚本。$document_root
设置为/path/to/php-app
。与仍包含前缀$fastcgi_script_name
的相同。$uri
/app
正确的做法是使用$request_filename
并删除你的虚假root
声明:
location ^~ /app {
alias /path/to/php-app;
index index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
}
fastcgi_params
始终在任何语句之前包含,fastcgi_param
以避免它们被包含文件的内容悄悄覆盖。请参阅这个文件了解详情。