在 apache 2.2.3 上设置通配符子域(带有反向代理)

Posted

技术标签:

【中文标题】在 apache 2.2.3 上设置通配符子域(带有反向代理)【英文标题】:Setting up Wildcard subdomain (with reverse proxy) on apache 2.2.3 【发布时间】:2010-11-14 07:26:22 【问题描述】:

我想要达到的目标如下: 我想让许多子域,例如 abc.domain.com 重定向到一个 url,例如 www.domain.com/something?subdomain=abc

由于我重定向到一个完全限定的域,我需要使用反向代理来避免浏览器中 URL 的更改。 (使用 [P] 标志并打开 mod_proxy 模块和其他一些模块)

这是我的 DNS 设置

*.domain.com.   14400    A  111.111.11.1

这是我的 apache 虚拟主机配置

<VirtualHost 111.111.11.1:80>
    ServerName www.domain.com
    ServerAlias *.lionite.com
    DocumentRoot /var/www/html
    ErrorLog /var/www/logs
    UseCanonicalName off

RewriteEngine on
RewriteCond %REQUEST_URI !^/images
RewriteCond   %HTTP_HOST      !^www\.domain\.com$
RewriteRule   ^(.+)     %HTTP_HOST$1          [C]
RewriteRule   ^([^.]+)\.domain\.com(.*) http://www.domain.com/something?subdomain=$1 [P,L]

此设置运行良好(如果您认为当然可以改进,请告诉我)。

我的主要问题是当我尝试设置 https://

这是我的 apache 虚拟主机配置

<VirtualHost 111.111.11.1:443>
ServerName www.domain.com:443
ServerAlias *.domain.com
DocumentRoot /var/www/html

SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /etc/httpd/conf.d/cert/server.crt
SSLCertificateKeyFile /etc/httpd/conf.d/cert/server.key

<Directory "/var/www/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>

SetEnvIf User-Agent ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

CustomLog logs/ssl_request_log \
          "%t %h %SSL_PROTOCOLx %SSL_CIPHERx \"%r\" %b"

    RewriteEngine on
    RewriteCond %REQUEST_URI !^/images
    RewriteCond   %HTTPS_HOST      !^www\.domain\.com$
    RewriteRule   ^(.+)     %HTTPS_HOST$1          [C]
    RewriteRule   ^([^.]+)\.domain\.com(.*) https://www.domain.com/something?subdomain=$1 [P,L]

</VirtualHost>

每当我打电话给https://abc.domain.com - 我得到的响应是主页,但无论我在子域的末尾附加什么,我都会得到相同的响应。好像重写反应不好。

如果您能提供任何帮助,我们将不胜感激,或者如果您能分享您如何一起设置反向代理、重写、通配符子域和 SSL

谢谢,

【问题讨论】:

这个问题更适合 serverfault.com 我已经在 serverfault.com 上发布了这个问题,但没有收到任何答案,我决定也在这里发布。 【参考方案1】:

我也遇到过同样的问题。我解决它的唯一方法是将需要安全连接的不同域放在不同的侦听端口上,因为我受到 IP 地址的限制。

据我了解,问题是在 https 协议中,HOST 未包含在请求中。因此,当请求到达服务器时,apache 只使用 IP 和接收连接的端口上的第一个匹配项,因为它不知道请求来自的域。

解决此问题的唯一方法是为每个域使用不同的 IP 或不同的端口。

不幸的是,您在使用带有通配符域设置的 https 时运气不佳,我不相信有任何方法可以让它工作。

【讨论】:

尝试做类似的事情并找到了这个答案。我相信这是可以做到的。 HOST 标头在每个请求上发送,但这成为一个问题的地方是 w/ 基于名称的虚拟主机。必须先处理 SSL 层,然后 apache 才能访问 Host 标头。这意味着您不能使用 SSL 来使用基于名称的虚拟主机。但是您应该能够使用重定向执行 Adam 想要的操作,因为 SSL 层已经被处理,并且 Host 标头可用于重写指令。我没有在文档中看到提到 HTTPS_HOST,所以也许应该使用 HTTP_HOST?

以上是关于在 apache 2.2.3 上设置通配符子域(带有反向代理)的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别