我有以下情况:
http://remote/webapp
我希望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>
答案 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/
我知道这是一个简化而粗略的解决方案,但适用于我的目的。