Nginx 请求错误的文件 URL

Nginx 请求错误的文件 URL

我正在将我的网站从 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

相关内容