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

如何通过.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 02:12:42