我在 Apache Tomcat 前面使用 Apache HTTPD,并具有以下虚拟主机:
$ cat /etc/apache2/sites-enabled/onlinetaskboarddotcom
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName www.onlinetaskboard.com
ServerAlias onlinetaskboard.com
DocumentRoot /home/ubuntu/www/apache/onlinetaskboarddotcom
ProxyPass / http://www.onlinetaskboard.com:8080/
ProxyPassReverse / http://www.onlinetaskboard.com:8080/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /home/ubuntu/www/apache/onlinetaskboarddotcom/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
没有子域名的 URL www
(如onlinetaskboard.com/login
和)可以onlinetaskboard.com/someOtherValidPage
正常工作,但是一旦我包含www
子域名(如)www.onlinetaskboard.com
,则在某些浏览器(如 Chrome)中会出现 404 错误。
以下是我在 Chrome 中观察到的请求/响应标头。
使用www
子域名:
要求: 请求网址:http://www.onlinetaskboard.com/ 请求方法:GET 状态代码:404 未找到 请求标头: 接受:text/html、application/xhtml+xml、application/xml;q=0.9,*/*;q=0.8 接受编码:gzip,deflate,sdch 接受语言:en-US,en;q=0.8 连接:保持活动 Cookie:JSESSIONID=DE44F60835D23E6AB3CC2A2E8B9D6279 主机:www.onlinetaskboard.com 用户代理:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML,如 Gecko) Ubuntu Chromium/28.0.1500.71 Chrome/28.0.1500.71 Safari/537.36 响应标头: 连接:保持连接 内容编码:gzip 内容长度:377 内容类型:text/html;字符集=ISO-8859-1 日期:2013 年 11 月 14 日星期四 23:39:24 GMT 保持活动:超时=5,最大=99 服务器:Apache-Coyote/1.1 变化:接受编码 X-Pad:避免浏览器错误
不包含www
子域名的情况:
要求: 请求网址:http://onlinetaskboard.com/ 请求方法:GET 状态代码:302 已找到 请求标头: 接受:text/html、application/xhtml+xml、application/xml;q=0.9,*/*;q=0.8 接受编码:gzip,deflate,sdch 接受语言:en-US,en;q=0.8 缓存控制:最大年龄=0 连接:保持活动 Cookie:JSESSIONID=36D1DED5A3F7B5E185FE5D5EDD4457FC 主办方:onlinetaskboard.com 用户代理:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML,如 Gecko) Ubuntu Chromium/28.0.1500.71 Chrome/28.0.1500.71 Safari/537.36 响应标头: 连接:保持连接 内容长度:0 日期:2013 年 11 月 15 日星期五 00:04:33 GMT 保持活动:超时=5,最大=100 地址:http://onlinetaskboard.com/login 服务器:Apache-Coyote/1.1
这是如何造成的?如何解决?
答案1
是否有东西在另一侧验证 URL?如果您只是转到 ip.address:8080,会发生什么情况?您会得到 404 吗?我只是想知道这是否是 tomcat 可以做的事情。
另外,如果你添加
“ProxyPreserveHost 开启”
这将保留请求标头,以便您可以将其传递给 tomcat。
另外,你为什么有这些?cgi-bin 等等:
选项 FollowSymLinks AllowOverride 无
<Directory /home/ubuntu/www/apache/onlinetaskboarddotcom/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
答案2
我认为您遇到的困难是您的反向代理配置与 apache 虚拟主机服务器名具有相同的主机名。
仅保留最相关的指令:
<VirtualHost *:80>
ServerName www.onlinetaskboard.com
DocumentRoot /home/ubuntu/www/apache/onlinetaskboarddotcom
ProxyPass / http://www.onlinetaskboard.com:8080/
ProxyPassReverse / http://www.onlinetaskboard.com:8080/
</VirtualHost>
ProxyPass /
由于您使用指令将所有内容转发到 tomcat,因此 DocumentRoot 有点多余。
我认为使用相同的 ServerName 作为 tomcat URL 的主机名可能会破坏重定向,请尝试以下操作:
<VirtualHost *:80>
ServerName www.onlinetaskboard.com
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</VirtualHost>