You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用.htaccess将带多参数URL重定向到首参数命名的子路径?

解决带额外参数的URL重定向404问题

需要将带UTM等额外参数的旧URL:

https://example.com/blog/?p=title-of-blog-post&utm_source=browser&utm_medium=rss_notification&utm_id=600215.0720246513

重定向到简洁的友好URL:

https://example.com/blog/title-of-blog-post

仅提取第一个p参数,但当前配置的.htaccess因为额外参数的存在触发了404错误,原配置代码如下:

Options +FollowSymLinks +ExecCGI
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /blog/

RewriteCond %{THE_REQUEST} \s/blog/\?p=([\w-]+)\s [NC]
RewriteRule ^ %1? [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([\w-]+)/?$ ?p=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>

问题原因

第一个RewriteCond的正则表达式要求p=([\w-]+)后面必须紧跟空格(\s),但当URL带有额外参数时,p参数后面是&而非空格,导致规则匹配失败,无法触发重定向,最终返回404。

修复方案

修改第一个RewriteCond的正则,允许p参数后面跟随任意额外参数或者空格:

修改后的完整.htaccess代码:

Options +FollowSymLinks +ExecCGI
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /blog/

# 匹配带p参数(可含其他额外参数)的旧URL,重定向到友好URL
RewriteCond %{THE_REQUEST} \s/blog/\?p=([\w-]+)(?:&.*)?\s [NC]
RewriteRule ^ %1? [R=301,L]

# 将友好URL反向重写为带p参数的格式
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([\w-]+)/?$ ?p=$1 [L]

# 所有其他请求转发到index.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>

规则说明

  • (?:&.*)?是一个非捕获组,用于匹配&开头的任意后续参数(.*匹配任意字符),末尾的?表示这个组是可选的,兼容没有额外参数的情况
  • 重定向规则末尾的?用于清空原URL的所有查询参数,确保重定向后的URL干净无多余参数

内容的提问来源于stack exchange,提问作者Finder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 04:55:14