带有参数的 url 的 Apache RewriteCond

Apache RewriteCond for url with parameters

欢迎,

很长一段时间我都在努力解决将 url 重定向到单独的 url 的问题,以防出现特殊的 baerer 令牌,我不想更改任何参数只是进行匹配并将此匹配发送给另一个 url。 我的设置是 apache 2.4.41 邮递员的典型要求: https://xxxdddyyy.dqco1.firma-online.com/rest/auto-com/complete_addr?in_country=FR&in_line=73 avenue des lilas&access_token=988738467 重定向应该是这样的: http://tomcat-local:10022/rest/auto-com/complete_addr?in_country=FR&in_line=73 avenue des lilas&access_token=988738467

到目前为止我尝试了什么 在 apache2.conf

RewriteCond %{QUERY_STRING} ^access_token=(988738467)$
RewriteRule  (.*)  http://tomcat-local:10022/ [R=301,L]

目标是具有特定令牌的客户端将由特定 tomcat 服务器提供服务

请帮助我,也许我做错了什么,我也尝试了 RedirectMatch,不幸的是没有成功,我在 https://regex101.com/

上测试的所有正则表达式

编辑:

仍然没有,我不明白哪里出了问题。我的配置

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} (^|&)access_token=988738467($|&)
RewriteRule ^(.*)$ http://tomcat-local:10022/ [QSA,P,L]
</IfModule>
# disable some HTTP request types for security reasons
<IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{REQUEST_METHOD} ^TRACE
        RewriteRule .* - [F]
</IfModule>
<IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{REQUEST_METHOD} !^(GET|POST|HEAD|OPTIONS)$
        RewriteRule .* - [F]
</IfModule>

Access_log :

"GET /rest/auto-com/complete_addr?in_country=FR&in_line=73%20avenue%20des%20lilas&access_token=988738467 HTTP/1.1" "complete_addr" 200 200 1225 "-" "PostmanRuntime/7.28.4" 

已解决

RewriteEngine On
RewriteOptions InheritDown
RewriteCond %{QUERY_STRING} (^|&)access_token=988738467($|&)
RewriteRule ^(.*)$ http://tomcat-local:10022/ [QSA,P,L]

# disable some HTTP request types for security reasons
RewriteCond %{REQUEST_METHOD} ^TRACE
RewriteRule .* - [F]
RewriteCond %{REQUEST_METHOD} !^(GET|POST|HEAD|OPTIONS)$
RewriteRule .* - [F]

你好保罗

最后通过在重写规则之前添加RewriteOptions InheritDown,并为所有虚拟主机添加RewriteEngine On解决了这个问题。

尝试:

RewriteCond %{QUERY_STRING} (^|&)access_token=988738467($|&)
RewriteRule ^(.*)$ http://tomcat-local:10022/ [QSA,R=301,L]

这将重定向:

  1. https://xxxdddyyy.dqco1.firma-online.com/rest/auto-com/complete_addr?in_country=FR&in_line=73 avenue des lilas&access_token=988738467http://tomcat-local:10022/rest/auto-com/complete_addr?in_country=FR&in_line=73 avenue des lilas&access_token=988738467 如果 access_token988738467
  2. https://xxxdddyyy.dqco1.firma-online.com/rest/auto-com/complete_addr?abc=123&access_token=988738467http://tomcat-local:10022/rest/auto-com/complete_addr?abc=123&access_token=988738467

虽然我给了你这个解决方案,但我仍然很困惑你为什么要对本地页面进行外部重定向。我相信你想要代理通行证。

问题 Rewrite* 无效的解释:

  1. ^access_token in ^access_token=(988738467)$ 表示 access_token 必须是查询字符串中的第一个。
  2. (988738467)$表示988738467必须在查询字符串的末尾。

由于上述问题,只有 https://https://xxxdddyyy.dqco1.firma-online.com/anything?access_token=988738467 可以使用您的 RewriteCond


编辑:

对于后端服务器的内部重定向:

RewriteCond %{QUERY_STRING} (^|&)access_token=988738467($|&)
RewriteRule ^(.*)$ http://tomcat-local:10022/ [QSA,P,L]

您可能希望启用模块 mod_proxymod_proxy_http

编辑 2:

您的配置应该是:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} (^|&)access_token=988738467($|&)
RewriteRule ^(.*)$ http://tomcat-local:10022/ [QSA,P,L]

# disable some HTTP request types for security reasons
RewriteCond %{REQUEST_METHOD} ^TRACE
RewriteRule .* - [F]
RewriteCond %{REQUEST_METHOD} !^(GET|POST|HEAD|OPTIONS)$
RewriteRule .* - [F]
</IfModule>

确保 mod_rewrite 已启用。我建议您删除 IfModule 以避免在某天禁用 mod_rewrite 时造成混淆。因为IfModule会导致不显示错误,反而会造成混乱。

编辑 3:

在虚拟主机外添加 RewriteOptions InheritDown,导致规则被虚拟主机继承。

因此,所有虚拟主机都将使用它。

默认情况下,在 Apache 中,在虚拟主机外部指定的规则不会被虚拟主机继承。