0

0

如何在 Nginx 中实现仅允许指定路径访问,其余路径返回 404

碧海醫心

碧海醫心

发布时间:2026-01-08 23:12:04

|

536人浏览过

|

来源于php中文网

原创

如何在 Nginx 中实现仅允许指定路径访问,其余路径返回 404

本文介绍如何配置 nginx,使其仅对预定义的白名单路径(如 `/blog`、`/contact`、`/faq`)正常响应,而对其他未匹配路径(如 `/test`)直接返回标准 404 错误页,同时保留基础认证保护。

要实现“仅放行特定路径、其余一律 404”,核心思路是优先匹配显式声明的合法路径,再通过兜底规则拦截非法请求。由于你当前使用 location / { ... try_files ... } 的宽泛匹配方式,所有路径都会被重写到 /index.php,因此必须打破默认继承逻辑,改用更精确的匹配策略。

✅ 推荐方案:显式声明白名单 + 精确匹配 404 规则

假设你只允许 /blog、/contact、/faq 三个路径(及其子路径,如 /blog/post1),其余全部 404。可按如下方式重构 location 块:

# 全局启用基础认证(推荐上移至此,避免重复)
auth_basic "Restricted Content";
auth_basic_user_file /etc/nginx/.htpasswd;

# 显式允许的路径 —— 使用前缀匹配支持子路径
location /blog {
    try_files $uri $uri/ /index.php;
}

location /contact {
    try_files $uri $uri/ /index.php;
}

location /faq {
    try_files $uri $uri/ /index.php;
}

# 精确匹配非法路径(可选:针对已知无效路径快速拦截)
location = /test { return 404; }
location = /admin { return 404; }

# 【关键】兜底规则:匹配所有未被上述 location 捕获的请求
location / {
    return 404;
}
⚠️ 注意顺序:Nginx 按 location 块出现顺序自上而下匹配,且优先级遵循 = > ^~ > ~* > / 规则。因此必须将具体路径(如 /blog)放在通用 / 之前,否则会被兜底规则提前截断。

? 替代方案:使用 map(适用于超长白名单,如数百条)

若白名单路径极多(例如 2000+),硬编码 location 块会显著降低可维护性。此时推荐使用 map 指令在 http 块中预定义路径映射:

陌言AI
陌言AI

陌言AI是一个一站式AI创作平台,支持在线AI写作,AI对话,AI绘画等功能

下载
http {
    # 在 http 块顶层定义白名单映射
    map $uri $is_allowed_path {
        default         0;
        ~^/(blog|contact|faq)(/|$)  1;  # 支持 /blog 和 /blog/xxx
    }

    server {
        location / {
            auth_basic "Restricted Content";
            auth_basic_user_file /etc/nginx/.htpasswd;

            if ($is_allowed_path = 0) {
                return 404;
            }
            try_files $uri $uri/ /index.php;
        }
    }
}

❗ 注意:if 在 location 中虽可用,但应仅用于简单判断(如变量比较)。此处安全,因仅做布尔判断且无副作用。

✅ 最佳实践与注意事项

  • 认证位置优化:将 auth_basic 移至 server 或 http 块,避免在每个 location 中重复声明,提升可读性与性能。
  • 静态资源兼容性:确保 /blog/css/style.css 等真实静态文件能被 try_files 正确命中;若存在大量静态资源,建议单独配置 location ~ \.(css|js|png|jpg)$ 提升效率。
  • 404 页面定制:可通过 error_page 404 /404.html; 指向自定义错误页,并确保该路径本身在白名单中或通过 location = /404.html 显式放行。
  • 测试验证:修改后务必执行 sudo nginx -t 检查语法,并用 curl -I http://yoursite/test 验证返回 404 Not Found。

综上,对于少量路径,显式 location 是最清晰、高效、易调试的方式;对于海量路径,map + if 提供了良好的扩展性。二者均能严格满足“非白名单即 404”的安全需求。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2297

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1511

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1408

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

951

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1413

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1233

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1444

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1304

2023.11.13

php学习网站大全
php学习网站大全

精选多个优质PHP入门学习网站,涵盖教程、实战与文档,适合零基础到进阶开发者,助你高效掌握PHP编程。

0

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.4万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号