在Proxy之前重写Apache URL

时间:2014-12-08 18:00:12

标签: apache mod-rewrite virtualhost mod-proxy

我已将apache设置为我的应用程序的代理,需要在特定端口上运行,这适用于虚拟主机。现在我需要添加另一个指令,我需要从任何传入请求中删除/ ex /并将重写的url传递给代理。

我似乎无法兼顾两者,apache能够重写url但是无法代理并尝试自己提供请求,或者代理正确而无需删除/ ex /并且我的应用程序路由失败,因为它正在寻找/ ex /.

这是有效的代理配置(没有重写)。 如何在将其传递给代理之前删除/ ex /?显然apache不能同时[P,R],PT只是按原样转发。

<VirtualHost *:82>
  ServerName xxx
  ServerAlias xxx

  DocumentRoot /opt/xxx

  RewriteEngine On

  # neither of these works, simply proxies as is to my application, routing fails
  # RewriteRule ^ex/(.*) /$1 [L,R]
  # RewriteRule ^/ex$ / [L,PT]

  RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
  RewriteRule ^/(.*)$ http://127.0.0.1:11110%{REQUEST_URI} [P,QSA,L]

  ProxyPass / http://127.0.0.1:11110/
  ProxyPassReverse / http://127.0.0.1:11110/
  ProxyPreserveHost on

  # this doesn't work either
  # ProxyPass /ex http://127.0.0.1:11110/

</VirtualHost>

2 个答案:

答案 0 :(得分:1)

您可以使用ProxyPassMatch而不是ProxyPass:

ProxyPassMatch ^/ex/(.*) http://127.0.0.1:11110/$1

答案 1 :(得分:0)

简单,这一行

ProxyPass /ex http://127.0.0.1:11110/

应该在

之前
ProxyPass / http://127.0.0.1:11110/

as /将匹配所有内容,它是更大的桶然后/ ex,所以ProxyPass /应始终在配置文件中的最后。这意味着如果找不到匹配/模式,则/将在最后处理所有模式。