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

问题很简单, http://example.com和http://www.example.com是不一样的网站。 这个问题肯定是在我的VHostconfiguration中:

PassengerMinInstances 5 PassengerPoolIdleTime 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. 两个域都parsing为相同的IP地址:

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

    如果不是,则需要更新域名的DNS才能保持一致

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

我的答案是“我对ruby一无所知”。

你已经说过http://example.com and http://www.example.com aren't the same sites但你的虚拟主机configuration是说,他们是。

 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处理虚拟主机,那么我的回答是无用的:)

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

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