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

如何通过.htaccess将请求路由至public子文件夹并屏蔽直接访问

解决.htaccess中/public目录文件可通过两种路径访问的问题

我懂你现在的困扰——本来想把所有请求都导向/public下的index.php,结果现在/public里的内容既能通过domain.com/xxx正常访问,又能直接用domain.com/public/xxx绕开你的设置访问,这显然不是你想要的效果。咱们可以调整rewrite规则,先封掉直接访问/public的路径,再处理正常的请求转发。

这里给你修改后的.htaccess配置:

DirectoryIndex index.php
ErrorDocument 404 /404.html

<IfModule mod_rewrite.c>
    RewriteEngine On

    # 禁止直接访问/public目录及其下的所有内容
    RewriteRule ^public/(.*)$ - [R=404,L]

    # 仅当请求的文件/目录不存在时,转发到public/index.php处理
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ public/index.php/$1 [L]
</IfModule>

下面给你拆解下每个规则的作用:

  • 封禁直接访问/public的路径:第一条规则RewriteRule ^public/(.*)$ - [R=404,L]会捕获所有以public/开头的请求,直接返回404错误。如果你更希望把这类请求重定向到对应的根路径版本(比如把domain.com/public/about转到domain.com/about),可以把这条改成:

    RewriteRule ^public/(.*)$ /$1 [R=301,L]
    

    不过如果想完全隐藏public目录的存在,返回404会更合适。

  • 正常请求转发逻辑:后面的两个RewriteCond是用来判断当前请求的文件或目录是否真实存在——比如你的/public/css/style.css是实际存在的静态文件,这两个条件会让它直接被访问,而不会被转发到index.php。只有当请求的内容不存在时(比如动态路由),才会把请求转发到public/index.php,同时保留原请求的URI路径,确保你的应用能正常处理路由逻辑。

这样调整后,用户就只能通过根路径的方式访问内容,再也不能直接访问/public目录了。

内容的提问来源于stack exchange,提问作者denlau

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:54:19