apache2 mod_proxy与mod_rewrite结合不能按预期工作

我试图使用mod_rewrite和mod_proxy一起通过一个(假)子目录“foo”( http://example.com/foo )从不同的内部web服务器( http://webserver.internal.com/foo )提供内容)。

使用mod_proxy和ProxyPass指令我已经可以在/etc/apache2/mods-enabled/proxy.conf中使用这个configuration

ProxyPass /foo http://webserver.internal.com/foo ProxyPassReverse /foo http://webserver.internal.com/foo 

现在我有额外的要求来强制重写从http://example.com到https:// example.com的dynamic资源的所有请求,它们也是独立运行的,但不能与上面提到的ProxyPass规则一起使用。 看来代理configuration总是优先于重写规则。

就我的研究显示,在我的重写规则中使用mod_proxy应该像添加一样简单

RewriteCond%{REQUEST_URI} ^ / foo RewriteRule ^ / foo(。*) http://webserver.internal.com/foo $ 1 [P]

到我的重写规则和重写的URI将自动通过mod_proxy传递。 我打开了一个LogLevel为9的RewriteLog,但之后我无法看到^ / foo的匹配和下面的Proxy-RewriteRule的执行情况。 没有什么比预先代理,或任何提及的代理,甚至没有在RewriteLog中的错误条目。

我有我的apache2configuration中激活以下代理模块

 proxy proxy_connect proxy_http 

我试图用另一个例子来testing我的RewriteCondition – 这次匹配^ / foo并redirect到www.google.com

 RewriteCond %{REQUEST_URI} ^/foo RewriteRule ^(.*)$ http://www.google.com/ [R=302,L] 

这是按预期工作的,在RewriteLog中有以下结果:

RewriteCond:input ='/ foo'pattern ='^ / foo'=>匹配重写'foo' – >' http://www.google.com/ '明确强制redirecthttp://www.google.com/将http://www.google.com/redirectredirect转至http://www.google.com/ [REDIRECT / 302]

以下是我在我的虚拟主机的目录部分使用的重写configuration。

  <Directory /my/app/webroot > RewriteEngine On RewriteBase / #redirect all http requests to https - WORKING # incoming request was forwarded as http from ELB RewriteCond %{HTTP:X-Forwarded-Proto} =http # avoid https rewriting for static files like images, javascripts, files and templates # for folders /img, /js, /css, /files and /templates under webroot RewriteCond %{REQUEST_URI} !^/(img|js|css|files|templates) RewriteRule (.*) https:// example.com%{REQUEST_URI} [R=301,L] # requests to /foo *should* be handled by mod_proxy - NOT WORKING RewriteCond %{REQUEST_URI} ^/foo RewriteRule ^/foo(.*) http://webserver.internal.com/foo$1 [P] #pretty URLS for web-application - WORKING RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] </Directory> 

有问题的机器是一个基本的debian服务器安装,与apache2和php,并在Elastic Load Balancer背后的亚马逊云托pipe。

如果你读到这么远 – 首先 – 感谢你的耐心!

如果有人能帮助解决这个问题,那将是非常好的。 也许这只是我一直监督的一点。

提前谢谢了!

错误:

 RewriteRule ^/foo(.*) http://webserver.internal.com/foo$1 [P] 

Сorrectly:

 RewriteRule ^foo(.*)$ http://webserver.internal.com/foo$1 [P,L] 

将是一个问题,写信给电子邮件。