如何设置Nginx URI以修复重定向到命名位置的空URI

时间:2016-11-08 06:42:28

标签: php wordpress nginx nginx-location

问题:使用包含'%'的无效网址访问我们的网站时登录时,Nginx会抛出400 Bad Request错误。

我们希望将请求重写为(WordPress)404页面,而不是Nginx页面。

我尝试了以下内容:

location @400 {
    rewrite ^ /404 break;
}

error_page 400 =307 @400;

但是,这会在Nginx上生成500内部服务器错误。

Nginx错误日志说:' ...重定向到命名位置的空URI" @ 400"在阅读客户请求行...时,请求:" GET< invalid-url>"'。

这并不意外,因为原始网址无效。

所以我想我要找的是为重写明确设置URI。这该怎么做?还是有更好的方法?我对Nginx并不熟悉。

2 个答案:

答案 0 :(得分:1)

根据documentation,代码应该有所不同。

这是从文档复制的重写:

location /old/path.html {
    error_page 404 =301 http:/example.com/new/path.html;
}

问题是它是否可以像这样工作:

location 400 {
    error_page 400 =307 http:/example.com/400.html;
}

...因为在链接的github页上写着:

  

如果在配置中使用“ error_page 400 @name”之类的内容,   可以将请求传递到未设置URI的命名位置,这   反过来可能会导致分段错误或其他不良影响,因为   大多数代码都假定已设置URI。

     

通过此更改,nginx将捕获以下配置问题   ngx_http_named_location(),如果URI为,将停止请求处理   未设置,返回500。

如果这仍然是当前状态,则意味着在nginx中触发400错误会引发500错误。不过,仅使用此配置,我可能会触发400错误并提供自定义400页:

error_page 400 /400.html;

因此,您也可以尝试配置自定义错误500页面,但我从未运行过该页面,而是仅显示了nginx的常见500er页面。

您可以在此配置下尝试使用

error_page 400 /400.html;
error_page 404 /404.html;
error_page 500 /500.html;

如果这有效,则可以调整3xx代码,并根据需要进行更多调整。 当然,您也可以在出现400错误时提供404错误页面,但是我从未成功像这样重写错误标头:

error_page 404 =301 http:/example.com/new/path.html;

答案 1 :(得分:0)

我有相同的目标(返回444而不是自定义错误消息),并且使用@named_location遇到了相同的问题(对于某些奇怪的请求,尤其是在标头中未设置POST / GET / HEAD方法的情况下,Nginx返回了其默认的500错误页面,并报告错误日志:empty URI in redirect to named location "@named_location" while reading client request

Someone had opened a ticket with Nginx,这是响应:

  

[...]问题是您试图将在早期请求处理阶段(当请求URI尚未解析时)出现的错误重定向到命名位置。命名位置旨在保留现有的请求URI,并且将这样的不完整请求重定向到命名位置可能会在代码的其他部分引起严重的问题。这样,尝试进行这样的重定向会导致“重定向到命名位置的空URI”错误。反过来,这会阻止您使用自定义错误页面,因此将返回内部页面。   如果要处理在早期请求处理阶段出现的错误,例如400 Bad Request,请考虑使用带有明确设置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.

这似乎已经解决了问题。