问题:当使用包含“%”符号的无效 URL 访问我们的网站时,Nginx 会抛出 400 Bad Request 错误。
我们希望将请求重写为 (WordPress) 404 页面,而不是 Nginx 页面。
我已经尝试过以下方法:
location @400 {
rewrite ^ /404 break;
}
error_page 400 =307 @400;
但是,这会在 Nginx 上生成 500 内部服务器错误。
Nginx 错误日志显示:“...在读取客户端请求行时重定向到指定位置“@400”时空 URI...,请求:“GET ”'。
这并不意外,因为原始 URL 无效。
所以我想我正在寻找的是为重写显式设置 URI。这个怎么做?或者有更好的方法吗?我对 Nginx 不太熟悉。
我有相同的目标(返回 444 而不是自定义错误消息)并遇到了相同的问题@named_location
(对于某些奇怪的请求,特别是当 header 中没有设置 POST/GET/HEAD 方法时,Nginx 返回其默认的 500 错误页面,并报告错误日志:empty URI in redirect to named location "@named_location" while reading client request
).
有人用 Nginx 开了票 https://trac.nginx.org/nginx/ticket/1756,这是响应:
[...]问题是您试图将早期请求处理阶段(当请求 URI 尚未解析时)出现的错误重定向到指定位置。命名位置旨在保留现有的请求 URI,将此类不完整的请求重定向到命名位置可能会导致代码其他部分出现严重问题。因此,尝试执行此类重定向会导致“重定向到指定位置时 URI 为空”错误。这反过来又会阻止使用您的自定义错误页面,因此会返回一个内部错误页面。
如果要处理早期请求处理阶段出现的错误(例如 400 错误请求),请考虑使用具有显式设置 URI 的错误页面。或者您可以避免尝试重定向此类错误,因为这通常是更安全的方法。
请注意,服务器是 nginx,这并不是信息泄露。无论如何,它可以通过多种方式报告,包括服务器响应标头。如果您出于某种原因想要隐藏 nginx 版本,可以通过 server_tokens 指令来实现。
所以我将错误自定义更改如下:
error_page 301 400 403 404 500 502 503 504 =444 /444.html;
location = /444.html {
return 444;
}
# Instead of:
# error_page 301 400 403 404 500 502 503 504 =444 @named_location;
# location @named_locations {
# return 444;
# }
# which gives the above-mentioned error and returns Nginx's default 500 error page.
这似乎已经解决了问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)