【问题标题】:Apache mod_rewrite as proxy not workingApache mod_rewrite 作为代理不起作用
【发布时间】:2014-11-11 06:13:23
【问题描述】:

我正在尝试使用 apache 作为代理服务器来将一些请求重定向到在不同端口上运行的服务。我正在尝试按照此处的说明进行操作:http://httpd.apache.org/docs/2.4/rewrite/proxy.html

我已经完成了安装(仅此而已):

sudo apt-get install apache2
sudo a2enmod rewrite
sudo a2enmod proxy
sudo a2enmod proxy_http

然后编辑 /etc/apache2/httpd.conf 为:

RewriteEngine on
RewriteRule ^/(.*) http://localhost:9200/$1 [P]
ProxyPassReverse / http://localhost:9200/

最后,重新启动 apache2 (sudo service apache2 restart)。最终,我会为该规则添加一些实际条件,但我现在只是尝试对其进行测试。

但它不起作用。 curl -XGET localhost:80/foo 失败并返回 404 响应,curl -XGET loaclhost:9200/foo 成功。错误日志或访问日志中没有任何用处。

【问题讨论】:

    标签: apache mod-rewrite proxy mod-proxy


    【解决方案1】:

    我建议将您的 Apache 反向代理命令设置为这样的;注意ProxyPass 设置以及ProxyRequestsProxyPreserveHost 设置:

     <IfModule mod_proxy.c>
    
      # Proxy specific settings
      ProxyRequests Off
      ProxyPreserveHost On
    
      <Proxy *>
        AddDefaultCharset off
        Order deny,allow
        Allow from all
      </Proxy>
    
      ProxyPass / http://localhost:9200/ 
      ProxyPassReverse / http://localhost:9200/ 
    
    </IfModule>
    

    我还建议您使用-I 选项检查curl 中响应输出的标头,如下所示:

    curl -I localhost:80/foo
    

    它应该向您显示来自服务器的确切响应,这样您就可以完全了解什么可能失败以及什么可能有效。

    【讨论】:

    • 谢谢 - 我想我应该补充一点,我尝试使用 RewriteRule 的原因是因为我最终可能想要一些相当复杂的 RewriteConds,而不是仅使用 ProxyPass。
    • @JoeK 你把这两个问题混为一谈了。服务器本身——使用我的设置——将所有流量代理到http://localhost:9200/。你对mod_rewrite 所做的事情完全不同,并且超出了这个逻辑。
    • 有没有办法使用这些设置但只转发特定的请求方法?退后一步 - 我要做的是仅代理 GET 请求,仅代理特定路径的请求,并拒绝所有其他请求。我尝试使用这样的设置,加上一个额外的重写规则,但似乎代理是在重写之前发生的。例如,我添加了:RewriteRule .* - [F],但所有请求仍然成功通过。
    • @JoeK 抱歉,但您所问的内容没有重点,与您的问题不符。随意编辑您的问题,以更具体地详细说明您的目标是什么。但至于我的回答?完毕。如果您觉得这个答案对您有所帮助,请记得投票。如果它是解决您问题的答案,请记得将其勾选。
    猜你喜欢
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    相关资源
    最近更新 更多