RewriteRule替换为非文件路径URL经后续规则处理适配WordPress方案
可行的.htaccess配置方案
直接替换你现有配置为以下内容即可:
RewriteEngine On RewriteBase / # 匹配/foo/开头的所有请求,内部重写为/foo-xxx格式 RewriteRule ^foo/(.*) foo-$1 [QSA,DPI,L] # WordPress默认重写规则 RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]
原配置失效原因说明
- 无标记的重写规则:Apache会默认将重写目标识别为文件系统路径,找不到对应文件后就直接将原始请求
/foo/anything传给WordPress处理,相当于重写没生效。 - 加
[R]标记:触发的是30x外部重定向,会通知浏览器跳转,自然会改变地址栏URL,不符合内部重写的需求。 - 直接传
name=foo-$1参数:WordPress的文章查询参数为name,页面查询参数为pagename,硬编码参数只能匹配文章,无法适配页面等其他内容类型。 [PT]标记失效:[PT]的作用是将重写结果传给其他模块处理,你需要的是让重写后的URI重新走完整的重写匹配流程,因此[PT]不适用该场景。
配置原理
QSA标记:自动保留原请求携带的查询参数,比如/foo/bar?from=search重写后会变成/foo-bar?from=search,不会丢失额外参数。DPI标记:丢弃原请求的PATH_INFO信息,避免多余路径片段干扰后续匹配。L标记:终止当前轮次的重写规则执行,因为URI被修改,Apache会自动发起新一轮的重写匹配,此时重写后的/foo-anything会正常进入WordPress的默认规则,WordPress拿到的请求路径就是重写后的地址,不需要额外硬编码查询参数,自动适配文章、页面、自定义 post type 等所有内容类型,且全程为内部重写,浏览器地址栏不会发生变化。
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

