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

