如何在 nginx 上使用 404 拒绝

Posted

技术标签:

【中文标题】如何在 nginx 上使用 404 拒绝【英文标题】:How to deny with 404 on nginx 【发布时间】:2014-12-09 17:42:41 【问题描述】:

我想通过提供拒绝/允许指令来保护 nginx 中的某些位置,但我不希望外人知道某个位置被拒绝。我希望外人获得 404,而不是 403 http 代码。我的配置sn-p是

location /admin/ 
    uwsgi_pass myupstream1;
    include /path/to/uwsgi_params;

    allow 127.0.0.1;
    deny all;

当我尝试访问 /admin/ 时,nginx 以 HTTP 403 响应,但我希望它以 HTTP 404 响应。有什么办法吗?

【问题讨论】:

【参考方案1】:
error_page 403 404 /404.html;

location = /404.html 
    internal; #return 404


location /admin/ 
    uwsgi_pass myupstream1;
    include /path/to/uwsgi_params;

    allow 127.0.0.1;
    deny all;

The 'internal' returns 404 by default.

改编自这个答案here

【讨论】:

这实际上是返回正确的错误代码,还是只返回正确的资源? 我没有检查响应头,但我认为它会响应 403。我找到了另一个可能会更好的解决方案。 但这会将所有 403 更改为 404,与否?我更喜欢另一个答案,您在拒绝后添加 return 404; 行。 这确实会将所有 403 响应更改为 404。如果您想让此行为特定于 /admin/,您可以移动“error_page 403 404 /404.html;”进入它的位置块 虽然这个答案确实有效,但 nginx 文档建议第一行应该有一个赋值运算符,即 'error_page 403 =404 /404.html;'【参考方案2】:

更优雅的方法是创建自定义错误页面。在该页面中,您可以指定自定义消息,而不是显示 http 错误代码。

命名错误页面

error_page 403 =404 /40X.html;

    location /admin/ 
        uwsgi_pass myupstream1;
        include /path/to/uwsgi_params;
        allow 127.0.0.1;
        deny all;  
    

    location /40X.html 
    root path/to/public;
    

在你的 40x.html 中你可以写任何信息

<html>
<body> The requested resource is not available </body>
</html>

把这个 40x.html 放在你的 path/to/public 目录中

【讨论】:

谢谢。在我的 50x 配置文件中已经有了这个,不知道这是做事的方式,真的很好,知道他们不知道一个位置是否真的存在:) 我使用 addons.mozilla.org/en-US/firefox/addon/live-http-headers 验证了返回的 404 标头 - 在 /40X.html 节中使用 internal(而不是 @987654325 @) 返回默认的404 页面。【参考方案3】:

您可以使用“重写”而不是“全部拒绝”

location /admin/ 
    uwsgi_pass myupstream1;
    include /path/to/uwsgi_params;

    #allow 127.0.0.1;
    #deny all;

    rewrite ^/admin/(.*)$ /404.php?id=$1;


将 404.php 放入您的域的根目录(例如_http://127.0.0.1/404.php)或更改 "路径/to/file/404.php?id=$1"

【讨论】:

【参考方案4】:

return 404; 会做你想做的事。往下看

    location /admin/ 
        uwsgi_pass myupstream1;
        include /path/to/uwsgi_params;

        allow 127.0.0.1;
        deny all;
        #Following line returns 404
        return 404;
    

【讨论】:

我试过了,但它在允许和拒绝时都返回 404 它不起作用。更多deny 规则失效

以上是关于如何在 nginx 上使用 404 拒绝的主要内容,如果未能解决你的问题,请参考以下文章

Nginx:404错误时返回301重定向

如何自定义404页面?云服务器+Nginx中加3行配置搞定,小白跟着流畅操作

nginx process = 404 如何在try_files中回退

如何设置Nginx,使得其可以拒绝某些IP连接

在Nginx下搭建wordpress时,最易出现404问题,如何解决

服务器部署—若依vue如何部署到nginx里面?nginx刷新页面404怎么办?完美解决建议收藏