.htaccess重写规则附带domain参数时根路径请求不生效问题
根路径重写失效的核心原因
根路径请求无法正常附加参数,问题出在前置判断条件,和重写规则的匹配写法无关:
- 当前配置的两个判断逻辑为:请求指向的不是文件、请求指向的不是目录,满足才触发重写
- 当访问
https://example.com/时,服务器识别到的请求目标就是站点根目录本身——这是一个真实存在的目录,直接被!-d的判断拦截,根本走不到后续的重写规则执行环节,自然无法携带指定参数 - 之前尝试替换
^(.*)$、.这类匹配模式没有效果,就是因为请求在条件判断阶段就被过滤了,根本没进入规则匹配流程
适配需求的正确配置
调整判断逻辑,把根路径从"真实目录就排除"的规则里单独摘出来,既保留"非文件、非目录请求才重写"的原有逻辑,又让根路径请求可以正常触发重写带参:
RewriteEngine On # 条件1:排除所有指向真实文件的请求 RewriteCond %{REQUEST_FILENAME} !-f # 条件2:满足任意一个分支即可通过 # 分支1:请求为根路径,直接通过,不受"真实目录"判断限制 RewriteCond %{REQUEST_URI} ^/$ [OR] # 分支2:请求指向的不是真实目录,正常通过 RewriteCond %{REQUEST_FILENAME} !-d # 执行重写,保留原有附加参数逻辑 RewriteRule ^(.*)$ /index.php?domain=%{HTTP_HOST}&page=$1 [L,QSA]
配置运行逻辑说明
- 整套判断逻辑为:仅当请求同时满足「不是真实文件」+「是根路径 或 不是真实目录」时,才会触发重写
- 访问根路径
/时,不受真实目录的判断限制,正常触发重写;此时正则匹配到的$1为空字符串,index.php接收到的page参数为空,刚好匹配首页的业务逻辑 - 访问非根的真实目录(如
/static/)时,会被正常拦截,不会触发重写,完全符合初始需求 - 访问非根的不存在路径(如
/news/123)时,既不是文件也不是目录,正常重写并携带对应路径作为page参数 - 访问真实静态文件时,会被第一重条件直接拦截,不触发重写,保证静态资源可正常访问
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

