WordPress比价站.htaccess重写失效但重定向正常的技术咨询
问题解答
3. 为什么重定向有效但重写失效返回404?
这大概率是WordPress自身Rewrite规则和你的规则执行顺序、参数传递逻辑冲突导致的:
- 你的规则必须放在WordPress默认规则(
# BEGIN WordPress代码块)之前,否则WP的规则会先处理请求,你的重写规则根本没机会生效。 - 你的原重写规则存在两个核心问题:
- 目标URL里的
?会默认丢弃原请求的查询字符串,且$1作为查询参数是无值状态(比如/cars/tesla会被转为/cars/?tesla,即$_GET['tesla']为空值),WP的页面模板通常不会处理这种无键值对的查询参数,导致无法匹配对应页面,返回404。 - 缺少
QSA(Query String Append)标志,无法保证后续如果有额外查询参数时能正确传递。
- 目标URL里的
- 在线验证工具正常是因为没有模拟WordPress的规则环境,实际服务器上WP的规则会干扰你的重写逻辑。
修正后的重写规则(需放在WP规则之前):
# BEGIN me RewriteEngine On RewriteBase / # 排除真实存在的文件/目录,避免干扰正常访问 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^cars/([^/]+)$ /cars/?car=$1 [L,QSA] # END me # BEGIN WordPress # WP默认规则... # END WordPress
这里把$1映射为明确的查询参数car,方便PHP后续获取,同时加QSA保证参数传递,添加的条件能避免误重写真实存在的资源。
1. 重写正常后,服务器端PHP如何获取原URL?
内部重写是Apache服务器内部的请求转发,浏览器地址栏不变,但默认情况下PHP的$_SERVER['REQUEST_URI']会变为重写后的URL。要获取原请求信息,可通过Apache环境变量传递:
- 修改重写规则,添加
E标志把原请求的关键信息存入环境变量:
RewriteRule ^cars/([^/]+)$ /cars/?car=$1 [L,QSA,E=ORIGINAL_URI:%{REQUEST_URI}]
- 在PHP中通过
$_SERVER['REDIRECT_ORIGINAL_URI']获取原请求的完整URI(比如/cars/tesla),或者直接通过$_GET['car']拿到你需要的参数值(因为规则已经把$1映射到了car参数)。 - 前端JS的
document.location.href本身就是原URL(内部重写不会改变浏览器地址),前端直接取用即可。
2. 这种场景用重定向是否不可取?
确实不可取,理由如下:
- 用户体验差:重定向会让浏览器地址栏变为带
?的URL,破坏了你设计的友好URL结构,用户看到的不是预期的干净地址。 - 性能损耗:重定向会多一次HTTP往返请求,增加页面加载时间,对新站点的初始访问体验不利。
- SEO风险:302临时重定向不会传递页面权重,301永久重定向会让谷歌误认为是新旧内容替换(即便你没有旧内容),反而可能混淆搜索引擎对页面结构的判断。内部重写是服务器内部处理,URL保持友好,不存在这些SEO问题。
内容的提问来源于stack exchange,提问作者user1453920
相关产品推荐
相关产品推荐

