Apache 重定向 tomcat 的 302/301 和 404 重定向问题

Apache 重定向 tomcat 的 302/301 和 404 重定向问题

我在 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>

相关内容