如何通过.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
相关产品推荐
相关产品推荐

