我正在将我的网站从 Apache 迁移到 Nginx,但我遇到了一个问题,无法找到解决方案,无论是在这里还是在 Google 上。
问题:
在我的主页上,菜单栏上有一些项目,单击这些项目会调用.js脚本,而.js脚本又会调用一些php文件。
例如。http://localhost/cart/shopping_options.php/?func=get_shop_menu&ajax=1
例如。http://localhost/index.php/?func=get_request_demo&ajax=1
这在 Apache 上工作正常,但在 Nginx 上却不行。Nginx 会取尾部斜杠/
并将其转换为目录,因此,如果我查看 Nginx 错误日志,就会看到请求的文件是:
http://localhost/cart/shopping_options.php/index.php
nginx错误:
2019/04/29 21:29:23 [error] 5033#5033: *1 "/var/www/html/cart/shopping_options.php/index.php" is not found (20: Not a directory), client: 127.0.0.1, server: _, request: "GET /cart/shopping_options.php/?func=get_shop_menu&ajax=1 HTTP/1.1", host: "localhost", referrer: "http://localhost/"
如果有什么不清楚的地方或者需要更多信息,请发表评论。如果有人能帮我解决这个问题,那就太好了。有很多 .js 文件,这种在/
.php 后面放置 a 的编码做法已经在很多我都不知道的地方使用过,所以无法通过直接转到生成此链接的文件并修复代码来修复。
答案1
根据“正常”的 HTTP URL 语法,这些 URL 实际上是完全正确的。您一直依赖的附加功能是 Apache 中的“CGI pathinfo”,如果启用该功能,它会告诉 Web 服务器检测路径中间出现的 CGI 脚本,并将其余部分视为传递给 CGI 脚本的“虚拟”路径。
Nginx 某种程度上支持这个特性,但与 Apache 不同:它不会自动测试每个路径组件;您必须使用设置准确地告诉它在哪里分割输入路径fastcgi_split_path_info
。
通常的配置如下:
# https://security.stackexchange.com/questions/177354
location ~ \.php(?:$|/) {
try_files $uri =404;
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# [other options like fastcgi_pass follow]
}
总的来说,这不是一个非常可靠的功能,因为它需要网络服务器进行一些猜测,并且它存在各种安全问题(如 Security.SE 线程中所示)。在这个特定情况下,您的示例甚至没有很好地利用它 - 没有附加有用的路径,只有一个斜杠,所以这是一种浪费。(它的实际用途是当人们想通过模拟整个路径使 URL 看起来更美观时,例如。/shopping.php/products/1234?ajax=1
)