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

同上

最好用一个例子来解释:

我已经 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 标志从请求中丢弃原始查询字符串。

取决于这些指令的使用位置(例如 directoryserver 上下文)以及 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反向引用的值与之前略有不同。这些不再包含每个值(即 v1v2)。相反 %1 包含 v1/v2%2 包含 /v3(包括斜杠前缀)或者是 (当 p3 为空或省略)。