mod_rewrite:将请求从localhost重定向到远程服务器

时间:2012-10-29 17:05:04

标签: apache mod-rewrite

我有以下情况:

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

我希望mod_proxy将http://localhost/webapp?someparams等每个请求重写为http://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?someparams转换为http://remote/C:/Apache2.2/htdocs/webapp?someparams

如何配置mod_rewrite以正确处理它?<​​/ p>

2 个答案:

答案 0 :(得分:0)

因为看起来你有权访问vhost / server config,你应该抛弃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的错误配置。将重写规则放在<Directory>中时,文件路径将用于匹配而不是URI路径。根据{{​​3}}

  

匹配什么?

     

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

     

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

答案 1 :(得分:0)

感谢Jon的灵感,最后mod_proxy + mod_rewrite工作:

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

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