Mod_rewrite重写规则仅部分路径前缀生效原因咨询
问题原因及修复方案
核心故障原因
你的重写规则逻辑存在绑定错误:RewriteCond 配置仅会作用于紧随其后的第一条RewriteRule,你给自定义SEO路由绑定了两个完全不匹配的前置校验条件:
RewriteCond %{REQUEST_FILENAME} !-d:要求请求路径不是现有目录RewriteCond %{REQUEST_FILENAME}\.php -f:要求请求路径追加.php后缀后是真实存在的文件
当你请求poll/filename/10时,Apache解析到的REQUEST_FILENAME是站点根目录下的poll/filename/10,追加.php后为poll/filename/10.php,这个文件显然不存在,因此校验不通过,路由规则直接被跳过,返回404。
为什么换路径段就能生效
你本地刚好存在debate.php、expanded_debate.php这两个真实文件,当请求路径以这两个字符串开头时,Apache会自动将路径解析为「对应PHP文件+PATH_INFO参数」,此时REQUEST_FILENAME会被指向真实存在的PHP文件,刚好符合你写的第二个校验条件,因此规则能正常触发。而你没有poll.php、expandedebate.php这类文件,所以对应的路径段无法通过校验。
修复方案
调整重写规则的顺序,把不需要校验文件存在性的自定义路由放在最前面,通用的.php后缀自动补全规则放在后面即可:
Options -MultiViews RewriteEngine on # 自定义SEO路由,不需要额外文件校验 RewriteRule ^poll/([0-9a-zA-Z_-]+)/([0-9]+) expanded_debate.php?poll_title=$1&pollid=$2 [NC,QSA,L] # 通用的.php后缀自动补全规则,原来的两个Cond放在这里生效 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php [L]
内容的提问来源于stack exchange,提问作者Carson D
相关产品推荐
相关产品推荐

