使用 Apache 和 mod_proxy 重写子域名的 URL

使用 Apache 和 mod_proxy 重写子域名的 URL

我有一个安装了 mod_proxy 的 Apache Web 服务器和一个运行 Grails Web 应用程序的 Tomcat 服务器。Apache 使用代理将对 example.com:80 的请求重定向到我在 example.com:8008 上运行的 Tomcat。

我需要按以下方式重定向请求:

http://subdomain1.example.com:80/some-nice-seo-url

来自 apache 应该通过代理获取

http://example.com:8008/some-nice-seo-url-subdomain1

我如何使用以下 apache2 配置来实现这一点:

NameVirtualHost *:80

<VirtualHost *:80>
        ServerName example.com
        ServerAlias www.example.com
        <Proxy *>
                Order deny,allow
                Allow from all
        </Proxy>

        # compress text, html, javascript, css, xml:
        AddOutputFilterByType DEFLATE text/plain
        AddOutputFilterByType DEFLATE text/html
        AddOutputFilterByType DEFLATE text/xml
        AddOutputFilterByType DEFLATE text/css
        AddOutputFilterByType DEFLATE application/xml
        AddOutputFilterByType DEFLATE application/xhtml+xml
        AddOutputFilterByType DEFLATE application/rss+xml
        AddOutputFilterByType DEFLATE application/javascript
        AddOutputFilterByType DEFLATE application/x-javascript

        ExpiresActive On
        ExpiresByType text/html "access plus 7 days"
        ExpiresByType image/gif "access plus 1 months"
        ExpiresByType image/jpeg "access plus 1 months"
        ExpiresByType image/png "access plus 1 months"
        ExpiresByType text/css "access plus 14 days"
        ExpiresByType text/javascript "access plus 14 days"
        ExpiresByType application/x-javascript "access plus 14 days"
        ExpiresByType image/ico "access plus 1 months"

        RewriteEngine on
        # www to non-www using search-engine friendly 301
        RewriteCond %{HTTP_HOST} ^www.example.com [NC]
        RewriteRule ^(.*)$ http://example.com$1 [L,R=301]

        # IP canonicalization
        RewriteCond %{HTTP_HOST} ^1\.2\.3\.4
        RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]


        <Directory />
                Options FollowSymLinks
                 AllowOverride None
        </Directory>
        <Directory /opt/example/web-app>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        # redirect everything else to TOMCAT
        ProxyPass               / http://1.2.3.4:8008/
        ProxyPassReverse        / http://1.2.3.4:8008/
        ProxyPassReverseCookieDomain localhost example.com
        ProxyPreserveHost On
</VirtualHost>

感谢您的任何帮助!

答案1

好的,我已经让它运行了……

mod_rewrite 条件中的关键元素如下

    RewriteCond   %{HTTP_HOST} ^((?!www\.)[^.]+)\.example\.com$
    RewriteCond %{REQUEST_URI} ^/some.+$
    RewriteRule   ^(.+)  %{HTTP_HOST}$1  [C]
    RewriteRule   ^([^.]+)\.example\.com(.*) http://example.com:8008$2-$1 [P]
    ProxyPassReverse http://example.com/ http://example.com:8008/

第一个条件告诉 Apache 服务器捕获所有指向子域名的 URL - 子域名 www 除外。

第二个条件告诉 Apache,请求的路径 (URI) 必须以特殊指示符开头。在我的示例中,这是“some”。这很重要,否则所有 css/images/js 等都属于此重写条件,我的 tomcat 不会提供所有这些东西。

现在有两行重写规则。第一行匹配子域并将其保存在变量 $1 中。第二行匹配 URI 并将其保存在 $2 中。在第二条重写规则之后,我告诉系统如何构建新的 URL:

http://example.com:8008$2-$1 [P]

这里我重定向到系统上运行的 tomcat 服务器。使用 IP 而不是域名可能没问题。[P] 告诉系统使用 mod_proxy 重定向流量。

在最后一行,我们定义了一个 ProxyPassReverse 来重建来自代理并发往客户端浏览器的答案文档中的所有链接 - 因此所有http://example.com:8008锚点回到http://subdomain1.example.com

使用上述代码时,我的 tomcat 配置出现了一些问题。[P] 标志不会保留原始主机。因此,我不得不在 tomcat server.xml 中更改我使用的引擎的默认主机:

 <Engine name="Catalina" defaultHost="example.com">

希望这些信息能对某些人有所帮助。

最好的祝愿

相关内容