.htaccess配置RewriteRule无301重写请求到public目录index.php问题
原有配置失效原因
你配置的RewriteCond %{REQUEST_URI} ^/public/ [NC]条件要求请求路径必须以/public/开头才会触发后续重写规则,直接访问站点根路径或者其他非/public开头的路径都不会命中规则,因此不会转发到public目录,仍然展示根目录索引页。
正确配置方案
方案1:仅在根目录维护.htaccess
RewriteEngine On # 所有请求内部重写到public目录,无外部跳转,地址栏URL不变 RewriteRule ^(.*)$ /public/$1 [L] # 若public下对应文件/目录不存在,转发到index.php处理路由 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^public/(.*)$ /public/index.php?url=$1 [QSA,L]
方案2:拆分配置(更推荐,符合主流PHP框架规范)
- 根目录
.htaccess仅做目录转发:
RewriteEngine On RewriteRule ^(.*)$ public/$1 [L]
- 在
public目录下新建.htaccess处理路由转发:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
生效校验项
- 确认Apache已开启
mod_rewrite扩展 - 确认站点VirtualHost配置中
AllowOverride参数设置为All,允许.htaccess文件生效 - 若不需要保留public下静态资源直接访问能力(所有请求必须走index.php),删除对应配置中的两条
RewriteCond规则即可
内容的提问来源于stack exchange,提问作者Bert
相关产品推荐
相关产品推荐

