.htaccess配置Clean URL 保持地址不变转发到public/index.php
.htaccess 重写规则修改方案
你现有的根目录重写逻辑已经满足基础转发要求,无需调整,只需要补全public目录下缺失的重写规则即可实现需求。
保留根目录原有.htaccess配置
根目录规则不需要改动,原有逻辑已经实现了「请求静默转发到public目录、不改变地址栏」的基础能力,内容保持如下即可:
<IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^$ public/ [L] RewriteRule (.*) public/$1 [L] </IfModule>
注意:不要给这两条规则加
R=301/R=302跳转标记,否则会触发浏览器外部跳转,导致地址栏变更。
修改public目录下的.htaccess配置
你当前public目录下的配置只定义了重写判定条件,缺少实际执行转发的规则,替换为以下内容:
<IfModule mod_rewrite.c> Options -Multiviews RewriteEngine On # 按实际部署路径调整:部署在域名根目录填/,部署在/auth子目录填/auth/public RewriteBase / # 跳过真实存在的目录、文件请求,不做重写 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f # 核心规则:所有符合条件的请求内部转发到index.php,路径作为q参数传入 RewriteRule ^(.*)$ index.php?q=$1 [L,QSA] </IfModule>
规则说明
- 核心转发规则
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]全程使用内部重写,没有加跳转标记,浏览器地址栏会始终显示用户输入的原始URL,不会发生变化 [L]标记表示匹配到当前规则后停止处理后续重写规则,避免规则循环[QSA]标记会自动保留原请求携带的查询参数,例如访问/anything?page=2时,最终服务端收到的请求是index.php?q=anything&page=2,不会丢失原有参数- 原有的两个
RewriteCond规则会自动过滤真实存在的静态资源(比如css、js、图片文件)请求,这类请求会直接返回对应文件,不会被转发到index.php
配置完成后直接测试即可:访问https://www.something.com/anything时地址栏保持不变,在public/index.php中读取$_GET['q']就能拿到anything的路径值。
内容的提问来源于stack exchange,提问作者roadrunner
相关产品推荐
相关产品推荐

