如何通过.htaccess将根目录请求指向public子目录index.php
.htaccess 配置调整方案
第一步:修改站点根目录(htdocs)下的 .htaccess
直接替换为以下完整配置,原有HTTPS强制跳转、HTTP/2支持的逻辑全部保留,新增public目录转发规则:
RewriteEngine On # 强制HTTPS 兼容反向代理/Cloudflare CDN场景 RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteCond %{HTTP:CF-Visitor} !{"scheme":"https"} RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 保留HTTP/2支持配置 Protocols h2 http/1.1 # 静态资源直接映射到public目录 不经过PHP解析 RewriteCond %{REQUEST_URI} !^/public/ RewriteCond %{DOCUMENT_ROOT}/public%{REQUEST_URI} -f [OR] RewriteCond %{DOCUMENT_ROOT}/public%{REQUEST_URI} -d [OR] RewriteCond %{DOCUMENT_ROOT}/public%{REQUEST_URI} -l RewriteRule ^(.*)$ /public/$1 [L] # 所有非静态请求统一转发到public目录入口文件 RewriteRule ^(.*)$ /public/index.php [L]
第二步:确认public目录下的 .htaccess 规则
你当前在/public/.htaccess中配置的路由规则不需要改动,保持原有内容即可,框架内部的路由解析会由这部分规则承接:
DirectoryIndex index.php <IfModule mod_rewrite.c> RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l RewriteRule ^(.*)$ index.php [QSA,L] </IfModule>
规则说明
- 你之前找到的参考规则
RewriteRule ^subfolder/$ /yourfile.php [L]仅能匹配路径完全等于子目录根的请求,无法覆盖多级路径、带查询参数的场景,也不能处理静态资源加载,不能直接套用。 - 本次配置使用Apache内部重写实现转发,不会在浏览器地址栏暴露
/public路径,符合PHP框架的生产部署规范。 - 静态资源(JS、CSS、图片、上传文件等)会被优先匹配直接返回,不需要经过PHP解析,不会影响站点加载性能。
- GET查询参数会自动透传,你列出的所有测试URL都可以正常命中
htdocs/public/index.php:https://your-example.com/https://www.your-example.com/https://www.your-example.com/test-foo/https://www.your-example.com/test-foo?data=data&foo=foo
- 配置生效前请清空浏览器缓存,301永久跳转的缓存会在本地保存较长时间,容易导致测试时看到旧规则效果。
内容的提问来源于stack exchange,提问作者user17161735
相关产品推荐
相关产品推荐

