如何禁止Symfony应用通过public目录路径访问?
禁止Symfony应用通过/public路径访问的.htaccess解决方案
可以通过修改根目录下的.htaccess实现禁止直接访问example.com/public的需求,具体方案如下:
核心思路
在现有规则前添加拦截逻辑,识别对/public的直接请求并处理(重定向或拒绝访问),避免和内部转发到public目录的规则冲突。
方案1:将/public请求重定向到根路径(301永久重定向)
在根目录.htaccess的RewriteEngine On之后、HTTPS/WWW重定向规则之前,插入以下规则:
# 拦截直接访问/public的请求,重定向到对应根路径资源 RewriteCond %{THE_REQUEST} /public/ [NC] RewriteRule ^public/(.*)$ /$1 [L,NE,R=301]
这样用户访问example.com/public/xxx会被自动跳转到example.com/xxx,不影响正常使用,同时规范访问路径。
方案2:直接返回403禁止访问
如果希望直接拒绝访问/public路径,可替换为以下规则:
# 禁止直接访问/public路径,返回403权限错误 RewriteCond %{THE_REQUEST} /public/ [NC] RewriteRule ^public/ - [L,R=403]
修改后的完整根目录.htaccess示例
RewriteEngine On # 拦截/public直接访问的规则(二选一) RewriteCond %{THE_REQUEST} /public/ [NC] RewriteRule ^public/(.*)$ /$1 [L,NE,R=301] # HTTPS与WWW域名标准化 RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} ^www\. [NC] RewriteRule ^ https://example.com%{REQUEST_URI} [L,NE,R=301] # 内部转发非public请求到public目录 RewriteCond %{REQUEST_URI} !^public/ [NC] RewriteRule ^(.*)$ /public/$1 [QSA,L,NE]
说明
- 使用
%{THE_REQUEST}是因为它记录的是用户发起的原始请求,能精准区分直接访问/public的请求和服务器内部转发到/public的请求,避免循环重定向。 - public目录下的.htaccess无需修改,内部转发的请求仍会正常处理。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

