【问题标题】:Apache Rewrite then Proxy PassApache Rewrite 然后 Proxy Pass
【发布时间】:2012-02-18 16:12:14
【问题描述】:

我有一个 Apache 服务器,它在我们的 DMZ 中用作反向代理。我们有一个外部服务回发到此服务器上的特定 URL。现在需要将此服务回发到一个全新的应用程序,但这很可能会在不久的将来再次发生变化,因为我们目前正处于测试阶段。

为了解决这个问题,我尝试接收传入的回发请求/smsPostback.php,并将其重写为新的相对 URL,/SMSHandler/Process。这部分工作正常。

然而,在配置下面立即定义,我有一个 ProxyPass 指令将所有到 /SMSHandler 的流量代理到内部服务器。

这些是 apache conf 文件中的新行:

RewriteRule ^/smsPostback.php$ /SMSHandler/Process 
##Proxy pass smshandler
ProxyPass /SMSHandler http://172.29.61.49:8080/SMSHandler
ProxyPassReverse /SMSHandler http://172.29.61.49:8080/SMSHandler

这些是重写日志中的日志:

172.29.61.49 - - [24/Jan/2012:18:43:36 --0500] [test.hidden.com/sid#5eace0][rid#446b770/initial] (2) init rewrite engine with requested uri /smsPostback.php
172.29.61.49 - - [24/Jan/2012:18:43:36 --0500] [test.hidden.com/sid#5eace0][rid#446b770/initial] (3) applying pattern '^/smsPostback.php$' to uri '/smsPostback.php'
172.29.61.49 - - [24/Jan/2012:18:43:36 --0500] [test.hidden.com/sid#5eace0][rid#446b770/initial] (2) rewrite '/smsPostback.php' -> '/SMSHandler/Process'
172.29.61.49 - - [24/Jan/2012:18:43:36 --0500] [test.hidden.com/sid#5eace0][rid#446b770/initial] (2) local path result: /SMSHandler/Process
172.29.61.49 - - [24/Jan/2012:18:43:36 --0500] [test.hidden.com/sid#5eace0][rid#446b770/initial] (2) prefixed with document_root to C:/hidden.com/SMSHandler/Process
172.29.61.49 - - [24/Jan/2012:18:43:36 --0500] [test.hidden.com/sid#5eace0][rid#446b770/initial] (1) go-ahead with C:/hidden.com/SMSHandler/Process [OK]

这是来自 apache 的错误日志条目:

[Tue Jan 24 18:43:36 2012] [error] [client 172.29.61.49] File does not exist: C:/fmfacilitymaintenance.com/SMSHandler

关于为什么它从不反向代理请求,而是尝试(并且失败)在本地服务它的任何想法?谢谢!

【问题讨论】:

    标签: apache mod-rewrite reverse-proxy


    【解决方案1】:

    您需要将PT (PassThrough) 添加到您的 RewriteRule,以便 apache 获取重写的 URI 并将其通过 URL 处理管道传递回(以便 mod_proxy 可以处理它)。规则应如下所示:

    RewriteRule ^/smsPostback.php$ /SMSHandler/Process [L,PT]
    

    【讨论】:

    • 你可以放弃Last,它暗示了直通httpd.apache.org/docs/2.2/rewrite/flags.html#flag_pt
    • 如果重写规则包含在.htaccess 文件中,这可能吗?似乎我的请求首先由代理处理,然后处理代理请求的服务器不关心 .htaccess 文件。不幸的是,出于商业规则的原因,我需要保留该文件中包含的规则。
    • @AdamTuttle 与 .htaccess,匹配的路径被认为是相对于当前目录,它不包含前导“/”。因此,您无法匹配它。
    猜你喜欢
    • 1970-01-01
    • 2015-01-29
    • 2014-06-04
    • 2020-11-06
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    相关资源
    最近更新 更多