Apache重写规则匹配任何不匹配的内容

Apache重写规则匹配任何不匹配的内容,apache,mod-rewrite,Apache,Mod Rewrite,我正在尝试代理流量,而不让Apache弄乱URL编码的路径内容。在研究这个问题时,我找到了这个解决方案 AllowEncodedSlashes On RewriteEngine on RewriteCond %{THE_REQUEST} "^[a-zA-Z]+ /foobar/(.*) HTTP/\d\.\d$" RewriteRule ^(.*)$ http://localhost:3333/foobar/%1 [P,L,NE] 因此,任何进入/foobar/的内容都应该代理到端口3333上

我正在尝试代理流量,而不让Apache弄乱URL编码的路径内容。在研究这个问题时,我找到了这个解决方案

AllowEncodedSlashes On
RewriteEngine on
RewriteCond %{THE_REQUEST} "^[a-zA-Z]+ /foobar/(.*) HTTP/\d\.\d$"
RewriteRule ^(.*)$ http://localhost:3333/foobar/%1 [P,L,NE]
因此,任何进入/foobar/的内容都应该代理到端口3333上的localhost。我运气不太好

10.36.163.39 - - [04/Dec/2013:15:32:21 --0500] [10.38.200.253/sid#11037e0][rid#117cd68/initial] (2) init rewrite engine with requested uri   /foobar/msl/v1/configuration/
10.36.163.39 - - [04/Dec/2013:15:32:21 --0500] [10.38.200.253/sid#11037e0][rid#117cd68/initial] (3) applying pattern '^(.*)$' to uri '/foobar/msl/v1/configuration/'
10.36.163.39 - - [04/Dec/2013:15:32:21 --0500] [10.38.200.253/sid#11037e0][rid#117cd68/initial] (1) pass through /foobar/msl/v1/configuration/
代理没有发生,因为重写规则显然不匹配,但它应该匹配任何东西,不是吗

  • 确保已加载mod_代理。
    P
    标志不会起任何作用,除非您加载了mod_代理,并且在大多数安装中默认情况下并不总是加载它

  • 如果您在服务器/VHOST配置文件中执行此操作,请考虑仅使用MODYPROGER本身。code>ProxyPass(和

    ProxyPassMatch
    )基本上执行您尝试执行的操作,您还可以反向代理Cookie并重定向:

    ProxyPassMatch ^/foobar/(.*)$ http://localhost:3333/foobar/$1
    

    删除重写条件,并使用此
    RewriteRule^/foobar/(.*)$http://localhost:3333/foobar/$1[P,L,NE]
    。只是好奇,你确定你需要
    allowencodedslash
    ?这并不能解决我的问题。URL编码的字符仍在使用该配置进行解码。这就是匹配%{the_REQUEST}的全部要点。那么,也许你可以让你的
    RewriteCond
    像这样的
    RewriteCond%{THE_REQUEST}/foobar/(.*)”
    限制稍微少一点,但似乎RewriteCond是匹配的,然后重写引擎尝试应用重写规则,结果失败了。不过我会试试的。事实上,我认为这很有效,它没有修改就通过了请求!同样,基本ProxyPass并不能解决url编码和解码的问题。ProxyPass对我来说本质上是坏的,因为它正在修改请求并将其传递给修改后的用户。nocanon选项被忽略,因此这没有帮助。apache日志明确地告诉我,出于安全原因,nocanon被忽略。“[Mon Nov 18 16:13:19 2013][warn][client 10.36.163.39]未替换的URL路径匹配代理传递;忽略不安全的nocanon”