You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过.htaccess禁止共享主机中/public文件夹被直接访问?

如何通过.htaccess禁止共享主机中/public文件夹被直接访问?

我完全懂你的困扰——现在你的路由规则已经能把根域名的请求都转发到public目录里,但只要有人直接输入https://test.com/public,还是能直接看到这个文件夹里的内容,对吧?别担心,咱们只需要在现有的.htaccess里加几行规则就能解决,而且完全不影响正常的站点访问逻辑。

修改后的完整.htaccess代码

直接替换你现有的内容就行:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    # 拦截所有直接访问/public的请求,返回403禁止访问
    RewriteRule ^public(/.*)?$ - [F,L]

    # 原有的站点路由转发规则
    RewriteRule ^$ public/index.php [L]
    RewriteRule ^((?!public/).*)$ public/$1 [L,NC]
</IfModule>

关键规则解释

咱们重点说下新增的那行拦截规则:

  • RewriteRule ^public(/.*)?$ - [F,L]
    • ^public(/.*)?$:这个正则会匹配所有以public开头的请求——不管用户是直接访问/public,还是/public/index.php、/public/css/style.css这类子路径,都会被命中。
    • [F]:这个标志会让服务器返回403 Forbidden错误,直接拒绝访问。
    • [L]:表示这是最后一条执行的规则,只要匹配到这条,后面的转发规则就不会再运行了,避免冲突。

可选:改成重定向到根域名

如果你不想让用户看到403错误,而是希望直接把他们跳转到根域名,也可以把拦截规则改成这样:

RewriteRule ^public(/.*)?$ / [R=301,L]
  • R=301:表示这是永久重定向,搜索引擎也会更新索引,适合长期使用。
  • 这样用户输入/public或者它的子路径时,会自动跳转到https://test.com,体验更友好。

为什么要把拦截规则放在最前面?

因为mod_rewrite是从上到下执行规则的,如果先运行转发规则,再拦截的话就晚了——直接访问/public的请求会先被转发到public/public/...(这显然不对),所以必须先把直接访问的请求拦下来,再处理正常的站点转发逻辑。

验证效果

修改完后你可以测试下:

  • 访问https://test.com:正常加载站点,和之前完全一样。
  • 访问https://test.com/public:会返回403错误,或者跳转到根域名(看你选的规则)。
  • 站点内部的静态资源(比如/css/style.css):会通过转发规则间接访问public/css/style.css,完全不受影响,因为用户请求的路径不是以public开头的。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 09:40:29