如何将带查询参数的URL转为简洁URL?htaccess规则失效求助
解决URL重写问题:将动态链接转为简洁URL
你的需求是把 mywebsite.com/blog_template?slug_url=blog-post-name 这类动态URL,对外显示为 mywebsite.com/blog-post-name,同时确保请求能正确转发到后端处理脚本。你的现有规则方向错误且位置不当,以下是修正方案:
修正后的.htaccess规则调整
把以下规则添加到RewriteEngine On和RewriteBase /之后、移除php规则之前:
# 1. 重定向旧动态URL到新简洁URL(利于SEO,可选) RewriteCond %{THE_REQUEST} ^GET\ /blog_template\?slug_url=([^&\s]+) RewriteRule ^ /%1? [R=301,L] # 2. 内部转发新简洁URL到实际处理脚本 RewriteCond %{REQUEST_FILENAME}!-f RewriteCond %{REQUEST_FILENAME}!-d RewriteRule ^([^/]+)$ /blog_template?slug_url=$1 [L]
关键说明
- 第一条规则是外部重定向:当用户访问旧的
/blog_template?slug_url=xxx时,会301跳转到/xxx,告知搜索引擎更新索引,避免重复内容。 - 第二条规则是内部转发:当请求路径不是真实文件或目录时,将
/xxx转发到/blog_template?slug_url=xxx,用户地址栏不会变化,但请求会被后端脚本正常处理。 - 规则顺序至关重要:必须将这两条规则放在移除.php的规则之前,否则会被.php规则优先匹配,导致转发失效。
完整的.htaccess代码
RewriteEngine On RewriteBase / # 处理博客URL重写 RewriteCond %{THE_REQUEST} ^GET\ /blog_template\?slug_url=([^&\s]+) RewriteRule ^ /%1? [R=301,L] RewriteCond %{REQUEST_FILENAME}!-f RewriteCond %{REQUEST_FILENAME}!-d RewriteRule ^([^/]+)$ /blog_template?slug_url=$1 [L] ErrorDocument 404 http://91.218.67.117/404/ ErrorDocument 500 http://91.218.67.117/500/ #redirect 404 RewriteCond %{REQUEST_URI} ^/500/$ RewriteRule ^(.*)$ /pages/errors/500.php [L] #remove php RewriteRule ^(.+)\.php$ /$1 [R,L] RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*?)/?$ /$1.php [NC,END]
注意事项
- 若网站根目录下有其他真实页面(如
/about、/contact),这些页面会被!-f和!-d条件排除,不会被转发到博客脚本,无需担心冲突。 - 测试阶段可先将
R=301改为R=302,确认正常后再改回301(永久重定向),避免缓存干扰测试结果。
内容的提问来源于stack exchange,提问作者NamingHH
相关产品推荐
相关产品推荐

