我有一个安装了 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">
希望这些信息能对某些人有所帮助。
最好的祝愿