0

我有以下情况:

  • 运行一些 webapp 的远程服务器http://remote/webapp
  • 公司网络内的本地计算机
  • 他们之间的公司代理
  • 在我的本地机器上运行带有 mod_rewrite 的 Apache

我想让 mod_proxy 将每个请求都重写http://localhost/webapp?someparamshttp://remote/webapp?someparams.

目前我有以下httpd.conf:

DocumentRoot "C:/Apache2.2/htdocs"

<Directory />
    RewriteEngine On
    RewriteRule ^(.+) http://remote/$1 
    Options FollowSymLinks
    AllowOverride All
    Order deny,allow
    Deny from all
</Directory>

这导致 mod_rewrite 转换http://localhost/webapp?someparamshttp://remote/C:/Apache2.2/htdocs/webapp?someparams

如何配置 mod_rewrite 以正确处理它?

4

2 回答 2

0

由于看起来您可以访问 vhost/server 配置,因此您应该放弃 mod_rewrite 并只使用 mod_proxy:

ProxyPass /webapp http://remote/webapp
ProxyPassReverse /webapp http://remote/webapp

并摆脱 2 mod_rewrite 行(这是重定向,而不是代理):

RewriteEngine On
RewriteRule ^(.+) http://remote/$1 

请注意,如果您有 cookie,则可能需要反向映射它们的域。使用ProxyPassReverseCookieDomain


还:

Windows 绝对路径出现在 URL 中的事实是由于 mod_rewrite 的错误配置,这是我试图避免的

这不是 mod_rewrite 的错误配置。当您将重写规则放入 a<Directory>时,匹配中将使用文件路径而不是 URI 路径。根据mod_rewrite 文档

什么是匹配的?

VirtualHost上下文中,模式最初将与主机名和端口之后、查询字符串之前的 URL 部分进行匹配(例如“/app1/index.html”)。

Directory和 htaccess 上下文中,模式最初将与文件系统路径匹配,在删除引导服务器到当前的前缀之后RewriteRule(例如,“app1/index.html”或“index.html”,取决于指令的定义位置) .

于 2012-10-30T06:26:27.563 回答
0

感谢 Jon 的启发,终于 mod_proxy + mod_rewrite 工作了:

# Global context
RewriteEngine On
RewriteRule ^(.+) http://remote/$1 [P]
ProxyPassReverse / http://remote/

我知道这是一个简化且粗略的解决方案,但适用于我的目的。

于 2012-10-30T09:30:44.377 回答