用N个参数重写查询字符串并替换空格

问题描述 投票:1回答:1

我需要从网址中删除查询字符串

site.com/somepage?p1=something1&p2=something2&..pn=somethingn

并将其变成类似:

site.com/somepage/something1/something2/../somethingn

我已经尝试过了,但是它不适合我要达到的目标。

RewriteCond %{QUERY_STRING} ^(.*)lang=([a-z]{2})&?(.*)$
RewriteRule (.*) /%2/$1?%1%3 [R=307]

同样在传递带有空格的值时,我需要将其重写为'-',但我不知道该怎么做

我在Ubuntu 16.04上使用apache 2.4

apache mod-rewrite apache2.4
1个回答
0
投票

由于参数的数量在您的情况下似乎是“无限的”,因此您可以创建一个循环来重写它们:

RewriteCond %{QUERY_STRING} ^[^&=]+=([^&]+)&?(.*)$
RewriteRule ^(somepage)(/.+[^/])?$ /$1$2/%1?%2 [R=301,L]

这将如下工作:

1) http://domain.tld/somepage?p1=something1&p2=something2&pn=somethingn
2) http://domain.tld/somepage/something1?p2=something2&pn=somethingn
3) http://domain.tld/somepage/something1/something2?pn=somethingn
4) http://domain.tld/somepage/something1/something2/somethingn

更新

我没有注意到您的第二个要求是when passing a value with spaces in the string, I need to rewrite it to '-'。为此,您可以将其与其他规则结合使用,例如:

RewriteCond %{QUERY_STRING} ^(.+?)(?:\s|%20)(.+)$
RewriteRule ^(.*)$ /$1?%1-%2 [R=301,L]

RewriteCond %{QUERY_STRING} ^[^&=]+=([^&]+)&?(.*)$
RewriteRule ^(somepage)(/.+[^/])?$ /$1$2/%1?%2 [R=301,L]

N越高(查询字符串中的空格越多),重定向次数就越高。

假设原始网址是http://domain.tld/somepage?p1=some thing1&p2=some%20thing2&pn=somethingn(是否已编码空格)。在这种情况下,它将如下工作:

http://domain.tld/somepage?p1=some thing1&p2=some%20thing2&pn=somethingn
http://domain.tld/somepage?p1=some-thing1&p2=some%20thing2&pn=somethingn
http://domain.tld/somepage?p1=some-thing1&p2=some-thing2&pn=somethingn
http://domain.tld/somepage/some-thing1?p2=some-thing2&pn=somethingn
http://domain.tld/somepage/some-thing1/some-thing2?pn=somethingn
http://domain.tld/somepage/some-thing1/some-thing2/somethingn
© www.soinside.com 2019 - 2024. All rights reserved.