如何用.htaccess将/blog/?p=参数重定向到对应子文件夹URL?
正确的URL重定向解决方案
问题分析
你之前的规则存在两个核心问题:
- 正则表达式
([0-9]*)仅匹配数字,但你的目标参数是标题字符串(包含字母、连字符等),无法匹配title-of-blog-post这类值 - 重写规则
^blog/([0-9]+)$同样只针对数字ID,无法处理标题路径,导致跳转后触发404
解决方案
1. 修改根目录/public_html/.htaccess文件
替换你之前添加的代码为以下内容:
RewriteEngine On RewriteBase / # 将 /blog/?p=xxx 重定向到 /blog/xxx(永久重定向) RewriteCond %{THE_REQUEST} \s/blog/\?p=([^\s&]+)\s [NC] RewriteRule ^ blog/%1? [R=301,L] # 将 /blog/xxx 内部重写到 /blog/?p=xxx RewriteRule ^blog/([^/]+)$ blog/?p=$1 [L]
2. 保留/blog/.htaccess原有内容
你现有的/blog/.htaccess已经可以处理内部路由到index.php,无需修改:
Options +FollowSymLinks +ExecCGI <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{SCRIPT_FILENAME} !-d RewriteCond %{SCRIPT_FILENAME} !-f RewriteRule ^.*$ ./index.php </IfModule>
关键说明
([^\s&]+):匹配任意非空白、非&符号的字符,完美适配标题格式(如title-of-blog-post)R=301:表示永久重定向,利于SEO;测试阶段可先用R=302临时重定向,确认无误后再改回301- 末尾的
?:清除原URL的查询字符串,避免跳转后URL残留?p=xxx - 内部重写规则:把干净的路径转换为原有的查询参数格式,确保/blog/下的程序能正确识别请求
内容的提问来源于stack exchange,提问作者Finder
相关产品推荐
相关产品推荐

