Apache mod_rewrite/mod_redirect:将带有查询参数的 URL 转换为 SEO 友好的 URL。一些查询参数被忽略
Apache mod_rewrite/mod_redirect: convert URL with query parameters into an SEO-friendly URL. some query parameters are ignored
同上
最好用一个例子来解释:
原始URL(参数顺序不一致)
如果我访问上面的 3 个示例 URL 中的任何一个,我想被重定向到 www.myhost.com/my-page/v1/v2
- p3 被故意忽略,因为它不再需要了。
- 在我的真实世界中URL,我有 p4 到 p6 参数也被忽略了。为了简单起见,我只写了 p3。
我已经 looked/searched 上网了,但没有什么比我想做的更接近。谢谢。
你可以像下面这样使用mod_rewrite:
RewriteEngine On
RewriteCond %{QUERY_STRING} (?:^|&)p1=([^&]+)
RewriteCond %1@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p2=([^&]*)
RewriteRule ^/?(my-page)$ //%1/%2 [QSD,R=302,L]
第一个 condition 捕获 p1
的值,并将其传递给第二个 condition,它也捕获 p1
的值p2
。然后在 substitution 字符串中分别将它们用作 %1
和 %2
反向引用。
URL 参数可以按任何顺序出现。
@
(在第二种情况下)只是一个任意字符,不会出现在 v1
中,因此在搜索时用作 v1
和查询字符串之间的分隔符p2
.
所有其他 URL 参数(即 p3
..pN
)将被忽略(并丢弃)。
参数 p1
必须存在且具有非空值(否则生成的重定向将不明确)。 p2
也必须存在,但值可以是空。例如。 /my-page?p2=&p1=v1
仍会成功重定向到 /my-page/v1/
。
QSD
标志从请求中丢弃原始查询字符串。
取决于这些指令的使用位置(例如 directory 或 server 上下文)以及 URL 的使用方式最终被路由,您可能需要添加一个 初始条件 以确保只处理直接请求(而不是重写请求)。
例如,如果需要,添加以下作为第一个条件:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
:
更新:
p1 and p2 are mandatory. p3 is optional.
您可以按如下方式更改上面的内容:
RewriteCond %{QUERY_STRING} (?:^|&)p1=([^&]+)
RewriteCond %1@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p2=([^&]+)
# Either p3 is mandatory and must have a value
RewriteCond %1/%2/@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p3=([^&]+) [OR]
# OR p3 is omitted or does not have a value
RewriteCond %1/%2 (.+)
RewriteRule ^/?(my-page)$ //%1%2 [QSD,R,L]
第二个条件现在确保 p2
参数有一个值(即 v2
)- 它不能为空。
然后第三个条件检查非空 p3
参数 或 第四个条件简单地捕获 p3
参数时的值为空或完全省略。
当 p3
不存在时,生成的重定向将省略尾部斜杠。例如,生成的重定向是 /mypage/v1/v2
或 /mypage/v1/v2/v3
。 (避免了可能出现在 /mypage/v1/v2/
上的尾部斜杠。)
在最终的substitution字符串中,%1
和%2
反向引用的值与之前略有不同。这些不再包含每个值(即 v1
和 v2
)。相反 %1
包含 v1/v2
而 %2
包含 /v3
(包括斜杠前缀)或者是 空 (当 p3
为空或省略)。
同上
最好用一个例子来解释:
原始URL(参数顺序不一致)
如果我访问上面的 3 个示例 URL 中的任何一个,我想被重定向到 www.myhost.com/my-page/v1/v2
- p3 被故意忽略,因为它不再需要了。
- 在我的真实世界中URL,我有 p4 到 p6 参数也被忽略了。为了简单起见,我只写了 p3。
我已经 looked/searched 上网了,但没有什么比我想做的更接近。谢谢。
你可以像下面这样使用mod_rewrite:
RewriteEngine On
RewriteCond %{QUERY_STRING} (?:^|&)p1=([^&]+)
RewriteCond %1@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p2=([^&]*)
RewriteRule ^/?(my-page)$ //%1/%2 [QSD,R=302,L]
第一个 condition 捕获 p1
的值,并将其传递给第二个 condition,它也捕获 p1
的值p2
。然后在 substitution 字符串中分别将它们用作 %1
和 %2
反向引用。
URL 参数可以按任何顺序出现。
@
(在第二种情况下)只是一个任意字符,不会出现在 v1
中,因此在搜索时用作 v1
和查询字符串之间的分隔符p2
.
所有其他 URL 参数(即 p3
..pN
)将被忽略(并丢弃)。
参数 p1
必须存在且具有非空值(否则生成的重定向将不明确)。 p2
也必须存在,但值可以是空。例如。 /my-page?p2=&p1=v1
仍会成功重定向到 /my-page/v1/
。
QSD
标志从请求中丢弃原始查询字符串。
取决于这些指令的使用位置(例如 directory 或 server 上下文)以及 URL 的使用方式最终被路由,您可能需要添加一个 初始条件 以确保只处理直接请求(而不是重写请求)。
例如,如果需要,添加以下作为第一个条件:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
:
更新:
p1 and p2 are mandatory. p3 is optional.
您可以按如下方式更改上面的内容:
RewriteCond %{QUERY_STRING} (?:^|&)p1=([^&]+)
RewriteCond %1@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p2=([^&]+)
# Either p3 is mandatory and must have a value
RewriteCond %1/%2/@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p3=([^&]+) [OR]
# OR p3 is omitted or does not have a value
RewriteCond %1/%2 (.+)
RewriteRule ^/?(my-page)$ //%1%2 [QSD,R,L]
第二个条件现在确保 p2
参数有一个值(即 v2
)- 它不能为空。
然后第三个条件检查非空 p3
参数 或 第四个条件简单地捕获 p3
参数时的值为空或完全省略。
当 p3
不存在时,生成的重定向将省略尾部斜杠。例如,生成的重定向是 /mypage/v1/v2
或 /mypage/v1/v2/v3
。 (避免了可能出现在 /mypage/v1/v2/
上的尾部斜杠。)
在最终的substitution字符串中,%1
和%2
反向引用的值与之前略有不同。这些不再包含每个值(即 v1
和 v2
)。相反 %1
包含 v1/v2
而 %2
包含 /v3
(包括斜杠前缀)或者是 空 (当 p3
为空或省略)。