.htaccess中RewriteRule不生效,URL伪静态改写失败求助
.htaccess URL重写规则失效排查与修复
我的.htaccess文件完整代码如下:
# BEGIN Options +FollowSymLinks -MultiViews RewriteEngine on RewriteBase / RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^/show_article/([0-9]+)\.php /show_article.php?article_id=$1 # END期望将链接
mysite.com/show_article?article_id=17转换为mysite.com/show_article/17格式的URL,但当前RewriteRule规则不生效,URL仍保持原格式,请求排查问题。
问题排查与修复要点
匹配路径格式错误
在.htaccess中,RewriteRule的匹配路径不需要开头的/(因为.htaccess基于当前目录做相对路径匹配),且你目标是匹配/show_article/17而非带.php的路径,原规则的匹配模式不符合需求。缺少动态URL到友好URL的重定向逻辑
原规则仅实现了友好URL反向映射到真实动态文件(让服务器识别/show_article/17对应show_article.php),但没有处理访问旧动态URL时自动跳转至友好URL的场景,所以原URL不会自动转换。冗余的RewriteCond规则
RewriteCond %{QUERY_STRING} ^(.*)$匹配所有查询字符串,对当前需求无实际作用,可直接删除。
修正后的完整.htaccess代码
# BEGIN Options +FollowSymLinks -MultiViews RewriteEngine on RewriteBase / # 301重定向动态URL到友好URL RewriteCond %{THE_REQUEST} ^GET\ /show_article\.php\?article_id=([0-9]+)\sHTTP/ RewriteRule ^show_article\.php$ /show_article/%1? [R=301,L] # 将友好URL内部映射到真实动态文件 RewriteRule ^show_article/([0-9]+)$ /show_article.php?article_id=$1 [L] # END
规则说明
- 第一部分规则:通过
%{THE_REQUEST}捕获原始请求行,匹配访问show_article.php?article_id=xxx的请求,执行301永久重定向到/show_article/xxx,末尾的?用于清除原查询字符串。 - 第二部分规则:匹配
/show_article/数字格式的友好路径,内部映射到真实的show_article.php?article_id=数字,[L]标记表示执行完该规则后停止后续匹配。
内容的提问来源于stack exchange,提问作者EighTainment
相关产品推荐
相关产品推荐

