通过.htaccess将请求重定向到子目录并隐藏中间目录
解决共享主机上隐藏应用内部目录的.htaccess配置方案
当前你的配置能实现请求映射,但允许直接访问/myapp/public这类内部路径,调整.htaccess规则即可解决问题,同时满足你指定的URL处理需求。
修改后的myapp/.htaccess配置
RewriteEngine On # 拦截直接访问敏感目录或public路径的请求,交由index.php处理 RewriteRule ^(public|private_config|private_uploads)(/.*)?$ public/index.php [QSA,L] # 将所有合法请求映射到public目录对应的路径 RewriteRule ^(.*)$ public/$1 [L]
myapp/public/.htaccess保持原有配置不变
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [QSA,L]
规则说明
- 第一条规则:匹配所有以
public、private_config、private_uploads开头的请求,直接转发到public/index.php处理,彻底避免这些内部目录被直接访问,同时符合你要求的这类URL由index.php处理的需求。[QSA,L]参数用于保留原请求的查询字符串,并且终止后续规则的执行。 - 第二条规则:把其他所有请求(比如
/myapp/images/existing_file.png)映射到public目录下的对应路径(即public/images/existing_file.png),实现将public作为请求根目录的效果。 public/.htaccess的原有规则继续生效:当public目录下不存在请求的文件或目录时,自动转发到index.php处理。
验证效果
- 以下URL会直接返回
myapp/public目录下的对应文件/目录:https://example.com/myapp/images/existing_file.pnghttps://example.com/myapp/images/https://example.com/myapp/css/
- 以下URL会交由
myapp/public/index.php处理:https://example.com/myapp/public/images/existing_file.pnghttps://example.com/myapp/images/does_not_exist.pnghttps://example.com/myapp/private_configs/secret.txt
内容的提问来源于stack exchange,提问作者user7401478
相关产品推荐
相关产品推荐

