我的 Web 应用程序 nginx 文件中有 50 多个位置匹配指令。在进行一些更改后,我在一个名为 /login 的位置指令上陷入了 302 重定向循环。它一直重定向到 302 /login 并且永远无法退出。在 nginx 指令中,我是否可以设置断点、日志,以便记录请求从哪个位置指令传递?这样我就可以知道哪个是错误的重定向或位置源?
我不认为调试日志提供该信息。
简而言之,在整个配置中精确、详细地跟踪请求的最佳方法是什么
答案1
为什么你有 50 多个位置匹配指令?正确的解决方案可能是改用指令map
。
调试产生意外后果的更改的正确方法是对更改进行修订控制:
如果进行了大量的更改,但从未进行过测试,那么您可以使用类似
git-bisect
找出违规指令。如果您已经知道有问题的变化,那么仔细检查每个部分就应该能发现问题。
但是,根据您屏幕截图中的主机名,并检查服务器的响应:
curl -v -k https://www.groupsitedev.com/login | & sed -E "s#^#`printf \\t`#g"
…
< HTTP/1.1 302 Moved Temporarily
< Server: nginx/1.13.3
< Date: Sun, 27 Aug 2017 02:21:44 GMT
< Content-Type: text/html; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< X-Runtime: 2
< Location: https://www.groupsitedev.com/login
< Cache-Control: no-cache
< Set-Cookie: _session_id=882afb51754b1cd5deef94cb65457625; domain=.groupsitedev.com; path=/
<
<html><body>You are being <a href="https://www.groupsitedev.com/login">redirected</a>.</body></html>
…,表明该问题可能与 nginx 无关,并且可能是在上游执行的:
您不太可能修改默认的 nginx 302 处理程序来提供类似这样的文本
<html><body>You are being <a href="https://www.groupsitedev.com/login">redirected</a>.</body></html>
,这不是默认的;而从低效的上游进行重定向的可能性更大(nginx 不会提供这样的自定义文本(带有超链接),因为将 URL 多次复制成现代浏览器永远不会显示的网页是低效的)您不太可能将 nginx 配置为自行发出会话 cookie;来自上游的 cookie 的可能性更大。
因此,总之,在 nginx 中没有什么可调试的——重定向显然来自你的上游,而你没有向我们透露任何相关信息。
答案2
在每个位置块中,添加一个该块独有的标头。使用这些标头,您可以确定 Nginx 选择了哪个块,这可以帮助您进行调试。
# Recommended
location / {
add_header Z_LOCATION "home";
}
location /admin/ {
add_header Z_LOCATION "admin";
}
如果愿意,您可以使用单个标题名称,但我想知道重写或转发等是否会掩盖系统的路径,所以我不会这样做。
# NOT recommended
location / {
add_header Z_LOCATION "home";
}
location /admin/ {
add_header Z_LOCATION "admin";
}
使用 Firefox 查看 URL / 页面实时 HTTP 标头插件或“curl -i”。您添加的标头将告诉您它命中了哪些块。与 curl 相比,Live HTTP Headers 的优势在于您无需继续发出命令,Firefox 将遵循重定向并向您显示每个请求/响应的标头。
您需要 Nginx 中的 headers_more 模块才能使 add_header 正常工作。您可以使用“nginx -V”检查是否已包含该模块。如果没有,则相对容易从源代码构建 Nginx。
当我学习 Nginx 并设置我的网站时,我发现这种技术非常有用。