example.com 和 www.example.com 指向两个不同的应用程序

example.com 和 www.example.com 指向两个不同的应用程序

问题很简单,http://example.comhttp://www.example.com不是同一个网站。问题肯定出在我的 VHost 配置上:

乘客最小实例数 5 乘客池空闲时间 0

<VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName example.com
        ServerAlias www.example.com
        DocumentRoot /home/someuser/www/example.com/public_html/public
        <Directory /home/someuser/www/example.com/public_html/public>
                AllowOverride all
                Options -MultiViews
        </Directory>
        ErrorLog /home/someuser/www/example.com/logs/error.log
        CustomLog /home/someuser/www/example.com/logs/access.log combined
        RailsBaseURI /
        PassengerSpawnMethod smart
</VirtualHost>

我还删除了所有不会导致启动错误的模块,这些是正在加载的模块:

# ls mods-enabled
alias.conf  alias.load  authz_default.load  authz_groupfile.load  authz_host.load  authz_user.load

答案1

这里有两件大事需要检查:

  1. 两个域名是否解析为同一个 IP 地址:

    尝试host example.com从命令行host www.example.com查看不同的请求是否被路由到同一台服务器。

    如果不是,你需要更新 DNS 以确保你的域名一致

  2. Apache 是否感到困惑?对于任何给定的请求,Apache 将使用第一的虚拟主机在其配置中具有匹配的ServerNameServerAlias。检查您没有冲突的 vhost 配置

答案2

在我的回答前面加上“我对 ruby​​ 一无所知”。

您已声明,http://example.com and http://www.example.com aren't the same sites但您的 vhost 配置表明它们是。

ServerName example.com
ServerAlias www.example.com

这些指令表示此虚拟主机将负责这两个名称。因此,听起来您只需要使用自己的ServerName指令将 www.example.com 拆分到自己的虚拟主机中即可。

<VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName example.com
        DocumentRoot /home/someuser/www/example.com/public_html/public
        ....other stuff....
</VirtualHost>
<VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName www.example.com
        DocumentRoot /home/someuser/www/www.example.com/public_html/public
        ....other stuff....
</VirtualHost>

如果 ruby​​ 处理 vhost 的方式存在一些魔法,那么我的答案就没用了:)

答案3

这个虚拟主机配置解决了我的问题:

<VirtualHost *:80>
        ServerName example.com
        ServerAlias *.example.com
        DocumentRoot /home/someuser/www/example.com/public_html/public
        <Directory /home/someuser/www/example.com/public_html/public>
                Options FollowSymLinks
                AllowOverride none
                Order allow,deny
                Allow from all
        </Directory>
        ErrorLog /home/someuser/www/example.com/logs/error.log
        CustomLog /home/someuser/www/example.com/logs/access.log combined
        RewriteEngine On
        RewriteCond %{HTTP_HOST} !^example\.com$ [NC]
        RewriteRule ^(.*)$ http://example.com$1 [R=301,L]
</VirtualHost>

相关内容