如何将Apache URI重写/代理到侦听特定端口/服务器的应用程序?

Ale*_*ach 10 apache mod-rewrite port mod-proxy

他们说Apache的mod_rewrite是URL操纵的瑞士军刀,但它能做到吗?

假设我想在我的Apache网络服务器中添加一个新的应用程序,其中该应用程序唯一可配置的选项是端口号.

我想使用&提供" http://hostname.example.com/app " 形式的网址,而不是" http://hostname.example.com:8080 ".这将确保客户也能通过该机构的防火墙,而且通常更整洁.

我的应用程序包括php,javascript和css中的绝对URI,因此我想将自己的根位置添加到应用程序内部链接中的URI.我无法访问DNS记录,因此无法创建另一个基于名称的虚拟服务器.

使用Apache的mod_rewrite和mod_proxy模块,我可以透明地将客户端重定向到应用程序的正确主页.但该主页中的链接并未将客户端指向相对于新基本URL的链接.

那么,将请求代理到正在侦听特定端口的应用程序的最佳方法是什么?

例如,如果我有一个应用程序侦听端口8080,我可以把它放在我的Apache配置中: -

<VirtualHost *:80>
    SSLProxyEngine On
    ServerName myhost.example.com
    RewriteEngine On
    UseCanonicalName On
    ProxyVia On
    <Location "/application">
        RewriteRule ^/application/?(.*) http://localhost:8080/$1 [P,L]
    </Location>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

如果应用程序不使用绝对URL,这可以正常工作,但确实如此.我需要做的是重写应用程序的css,javascript和php返回的URL.

我查看了ProxyPass和ReverseProxyPass文档,但我认为这些不会起作用..?

我也遇到过Nick Kew的mod_proxy_html,但这并没有包含在标准的Apache发布版中,而且我的机构的网络服务器似乎没有它好多年..除了手动拖网(或使用grep -r | sed)通过应用程序的源代码,或使用此第三方加载项,类型表达式,还有其他方法可以解决这个问题吗?

我可以在mod_rewrite规则中使用一些内部服务器变量吗?例如,基于'HTTP_REFERER'的重写规则?

Ale*_*sen 14

使用mod_proxy可以正常工作.例如,我映射https://localhost/yalla/到指向我的网络服务器的子目录:

LoadModule proxy_module modules/mod_proxy.so
ProxyRequests On
<Proxy *>
      Order deny,allow
      Allow from localhost
</Proxy>
ProxyPass /yalla/ http://yalla.ynfonatic.de/tmp/
Run Code Online (Sandbox Code Playgroud)

如果你实现了这个,你会注意到目录列表的图片是不可见的; 这是因为他们在下面的远程服务器上的/ tmp /目录,因此不可见.

所以,在你的情况下,你会这样做:

LoadModule proxy_module modules/mod_proxy.so
ProxyRequests On
<Proxy *>
      Order deny,allow
      Allow from localhost # Or whatever your network is if you need an ACL
</Proxy>
ProxyPass /app/ http://hostname.example.com:8080/
Run Code Online (Sandbox Code Playgroud)

与Apache配置中的所有内容一样,在引用目录时请查看那些尾随斜杠.

祝好运!亚历克斯.