【问题标题】:How to rewrite urls that go through apaches mod_proxy如何重写通过 apaches mod_proxy 的 url
【发布时间】:2011-06-05 15:29:09
【问题描述】:

我已使用 mod_proxy 和 mod_proxy_http 将我的 apache 2.2 服务器配置为简单的转发代理。

当客户端请求以下格式的 URL 时:

http://specific.host.com/specific?specificarg1=(.+)&specificarg2=(.+)&specificarg3=specificvalue

以重写的形式请求,其中 specificarg1specificarg2 的值被我的服务器配置中定义的值替换。

也可以不使用正则表达式,而是将特定的 url 重写为另一个特定的 url,但我更喜欢使用正则表达式匹配。

因此,在阅读了 mod_rewrite、mod_proxy 的文档后,我尝试了类似以下的方法来完全实现某种重写:

RewriteRule .* @987654321@ [P,L]

就像在服务器配置中一样,通过代理浏览时不会重写任何内容

<VirtualHost *:80>
ServerName domain-i-tried-to-surf-to.com
`RewriteRule .* http://www.google.com/ [P,L]
</VirtualHost>

也不行

ProxyPass(Reverse) / http://www.google.com
ProxyPass(Reverse) /path/i/tried/to/surf/to http://www.google.com

也没有运气

ProxyRemote * http://www.google.com

运气不好

我还尝试将重写规则放入 proxymatch 指令中,但我无法重写 url。有人能指出我正确的方向吗?

【问题讨论】:

    标签: apache mod-rewrite proxy url-rewriting mod-proxy


    【解决方案1】:

    您首先需要在最开始添加RewriteEngine on 语句,甚至让 mod_rewrite 来处理任何规则。

    【讨论】:

    • 可能应该提到我负责所有要启动的模块和引擎。我认为没有任何规则匹配,因为网页的来源不是本地服务器。我认为这些指令旨在处理当前主机“背后”的资源。无需用户配置代理什么的。我想要的是重写通过转发代理请求的 url,但它们的来源不是本地服务器。我知道它有点偏离主流,但我认为这应该是可能的,但文档对此非常模糊......
    • 一种“解决方法”将通过覆盖 /etc/hosts 中的 ip 将特定域上的请求强制发送到另一台服务器,然后该另一台服务器有一个配置为侦听它的 vhost vhost 容器,然后处理重写规则。但我有点不想涉及第二台服务器......
    • 啊。那么澄清一下:您将服务器 A 用作服务器 B 的代理,并且您将重写表达式放在服务器 A 中?如果这是正确的,您可以编辑您的问题并包含服务器 A 的整个配置文本,这样我就可以确定是什么,因为这应该可以正常工作,但我无法从您提供的 sn-ps 中看出发生了什么.
    • 很抱歉你是对的。我必须在 proxymatch 指令中包含 rewriteengine。现在我的 url 使用位置重定向进行重定向,尽管我包含了 [P] 标志。有什么想法吗?我在 serverconfig 中有代理请求,而不是在 proxymatch 指令中(这会产生错误)-我正在编辑 questino 以使一切更清晰
    • 奇数。好吧,来自httpd.apache.org/docs/2.2/rewrite/flags.html#flag_p 的小问题:如果您使用的是P,那么您就不需要L,因为这是暗示的。而且我猜您的位置重定向实际上来自您正在代理的服务器,而不是来自 mod_rewrite(除非您的 RewriteRules 之一中有错误的 R 指令)。
    猜你喜欢
    • 2013-11-28
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    相关资源
    最近更新 更多