Nginx   发布时间:2022-05-11  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了nginx try_files处理两次,如果设置了错误回退,则会失败大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一个位置块设置来捕获所有文件请求并将它们发送到php-FPM:

LOCATIOn  / {
    try_files  $uri /routIng.php?$args;
    fastcgi_pass   unix:/opt/local/var/run/php54/php-fpm-www.sock;
    include       /documents/projects/intahwebz/intahwebz/conf/fastcgi.conf;
}

这可以正确地将请求传递给php-FPM到请求的确切的现有php文件或者将routIng.php设置为要运行的脚本.

我试图添加一个错误页面,这样如果路由文件被删除或者不可用,将显示错误页面而不是Nginx的默认错误页面:

LOCATIOn  / {
    try_files $uri /routIng.php?$args /50x_static.html;
    fastcgi_pass   unix:/opt/local/var/run/php54/php-fpm-www.sock;
    include       /documents/projects/intahwebz/intahwebz/conf/fastcgi.conf;
}

这会停止提供routIng.php文件,而是显示50x_static.html页面.对现有php文件的请求仍然有效,即转到URL /dynamic.php

我意识到try_files命令中的最后一个参数有点神奇:

在调查error_page破坏配置的原因时,我意识到对于有效的配置(没有静态错误页面),在尝试获取根URL时,Nginx似乎确实根据Nginx重写日志匹配请求两次“/ “:

"^/proxy/(\d+)/(\w+)/(.+)\.(gif|png|jpg|jpeg|GIF|PNG|JPG|JPEG)$" does not match "/",client: 127.0.0.1,server: basereality.com,request: "GET / http/1.1",host: "basereality.test"
"^/proxy/(\d+)/(.+)\.(gif|png|jpg|jpeg|GIF|PNG|JPG|JPEG)$" does not match "/",host: "basereality.test"
"^/staticImage/(\w+)/(.+)\.([^\.]*)$" does not match "/",host: "basereality.test"
"^/proxy/(\d+)/(\w+)/(.+)\.(gif|png|jpg|jpeg|GIF|PNG|JPG|JPEG)$" does not match "/routIng.php",host: "basereality.test"
"^/proxy/(\d+)/(.+)\.(gif|png|jpg|jpeg|GIF|PNG|JPG|JPEG)$" does not match "/routIng.php",host: "basereality.test"
"^/staticImage/(\w+)/(.+)\.([^\.]*)$" does not match "/routIng.php",host: "basereality.test"

即,请求以/作为/,try_files无法提供文件,因此从/向/routIng.php重写请求,然后重新处理请求.

为什么尝试文件在第一次传递时不提供routIng.php文件?它存在且可访问,否则将不会在第二轮提供.

编辑

删除了不相关的配置.

@H_696_37@
最佳答案@H_696_37@
您引用的文档明确说“调用了最后一个参数的内部重定向”.内部重定向的处理方式与来自客户端的初始请求的处理方式相同 – 这包括处理服务器级别的重写语句,您可以在日志中看到.但是,如果除最后一个之外的任何其他try_files参数与现有文件匹配,则使用try_files语句所在的位置配置处理请求,并且不会有第二个匹配.

至于你的规则,你是否尝试在try_files中省略$args?

LOCATIOn  / {
    try_files $uri /routIng.php /50x_static.html;
    fastcgi_pass   unix:/opt/local/var/run/php54/php-fpm-www.sock;
    include       /documents/projects/intahwebz/intahwebz/conf/fastcgi.conf;
}

请注意,$uri也不包含$args;查询参数仍将通过QUERY_StriNG参数传递给FastCGI后端,该参数可能在fastcgi.conf中设置:

fastcgi_param QUERY_StriNG    $query_String;

如果$uri和/routIng.php都不作为文件存在,请求将被重定向到/50x_static.html并根据您的配置中的LOCATIOn = /50x_static.html部分进行处理(但是重写尝试的第二次迭代仍然会执行,因为您的重写规则放在服务器级别).

您的配置的一个非常可疑的细节是您通过php传递所有文件而不管文件扩展名 – 这是非常不寻常的,并且可能由于php代码在不期望的文件中执行而导致安全问题.

@H_696_37@

大佬总结

以上是大佬教程为你收集整理的nginx try_files处理两次,如果设置了错误回退,则会失败全部内容,希望文章能够帮你解决nginx try_files处理两次,如果设置了错误回退,则会失败所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: