带有多个查询字符串的 mod_rewrite

带有多个查询字符串的 mod_rewrite

这是我的问题的扩展https://serverfault.com/a/761474/77231

我正在尝试QUERY STRING向 URL 添加附加参数并将空格更改为下划线,但没有成功。

而不是简单地改变:

http://somedomainname.com/grafana/dashboard/db/generic-ping?var-device=SF-some.machinename.com

到:

http://somedomainname.com/grafana/dashboard/db/generic-ping?var-device=SF-some_machinename_com

我正在尝试更改其他参数,例如:

http://somedomainname.com/grafana/dashboard/db/generic-check?var-device=SF-some.machinename.com&var-check=Check CPU Load

到:

http://somedomainname.com/grafana/dashboard/db/generic-check?var-device=SF-some_machinename_com&var-check=Check_CPU_Load

使用我之前回答的问题中的相同逻辑,我能够使用以下方法使第一部分正常工作:

RewriteCond %{QUERY_STRING} (.*)\.(.*)\.(.*)
RewriteRule ^/grafana/dashboard/db/generic-check /grafana/dashboard/db/generic-check?%1_%2_%3 [R=301]

但这显然只让我得到了第一部分,结果是这样的:

http://somedomainname.com/grafana/dashboard/db/generic-check?var-device=SF-some_computername_com&var-check=Check%2520CPU%2520Load

我添加了一个额外的QUERY_STRING重写规则,例如:

RewriteCond %{QUERY_STRING} ^&var-check=(.*)\ (.*)\ (.*)
RewriteRule ^&var-check var-check=%1_%2_%3 [R=301]

...没有成功。

我也尝试过将两者结合起来:

RewriteCond %{QUERY_STRING} (.*)\.(.*)\.(.*)&(.*)\ (.*)\ (.*)
RewriteRule ^/grafana/dashboard/db/generic-check /grafana/dashboard/db/generic-check?%1_%2_%3&%4_%5_%6 [R=301]

..同样没有成功,以及使用%20 \s%2520代替\和空格...以及所有带有管道分隔符像\ |\s|%20|%2520

理想情况下,我希望一次重写就能完成,但只要它能正常工作,我就很高兴了。任何帮助我都会感激不尽。

答案1

通过添加以下条件和规则,我可以实现这一点。

RewriteCond %{QUERY_STRING} ^(.*)(%2520)(.*)(%2520)(.*)$
RewriteRule ^(.+)$ $1?%1_%3_%5 [R=301]

不幸的是,无论出现多少个空格,我都需要重复此条件/规则。我尝试了许多不同的条件和规则,但[N]似乎都没有达到预期的效果。

我仍然愿意接受答案,因为我觉得这可以做得更好、更可靠和/或更强大。

相关内容