网站URL重写失效求助:将动态URL转为静态友好URL
解决URL重写不生效的问题
我来帮你搞定这个URL重写的问题!先梳理下你现有配置里的几个关键问题,然后给出正确的解决方案:
现有配置的问题
- 你的
RewriteCond匹配的是?id=参数,但实际URL里的参数是p=10,这直接导致条件永远不满足,重写规则根本不会触发 - 你期望的目标路径是
post-details/,但现有规则里写的是/details/,路径完全不符 - 现有规则没有处理
text这个参数,所以没法把text=some-text-is-here转化为URL路径的一部分 - 后面的
RewriteRule看起来没写完,缺少了把友好URL映射回原PHP文件的内部重写规则
正确的.htaccess配置
下面是完整的、能实现你需求的配置:
RewriteEngine On # 1. 301永久重定向:将旧URL跳转到友好URL RewriteCond %{THE_REQUEST} \s/details\.php\?p=([0-9]+)&text=([^\s]+)\s [NC] RewriteRule ^ /post-details/%1/%2? [R=301,L] # 2. 内部重写:把友好URL映射回原PHP文件(用户看不到这个过程) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^post-details/([0-9]+)/([^/]+)$ /details.php?p=$1&text=$2 [L]
配置说明
第一部分(301重定向):
RewriteCond匹配真实的请求行,确保是访问details.php且同时带有p(数字ID)和text参数的请求RewriteRule将请求重定向到/post-details/%1/%2,其中%1对应捕获的数字ID,%2对应捕获的text参数值;末尾的?用于清除原URL的查询字符串,R=301表示永久重定向(利于SEO),L表示这是当前匹配的最后一条规则
第二部分(内部重写):
- 两个
RewriteCond确保请求的不是真实存在的文件或目录,避免干扰图片、CSS等静态资源的访问 RewriteRule将post-details/xxx/xxx格式的友好URL,内部映射回details.php?p=xxx&text=xxx,服务器会按原PHP文件处理请求,但用户浏览器地址栏显示的还是友好URL
- 两个
注意事项
- 确保你的Apache服务器已经开启了
mod_rewrite模块 - 如果是在子目录中使用该配置,需要添加
RewriteBase /你的子目录/到RewriteEngine On下面 - 测试前建议清空浏览器缓存,因为301重定向会被浏览器缓存,可能导致旧规则仍然生效
内容的提问来源于stack exchange,提问作者orichec1000
相关产品推荐
相关产品推荐

