1

这就是我在“etc/hosts”文件中的内容:

127.0.0.1 本地主机

127.0.1.1 gotqn-系统-产品-名称

127.0.0.1 depot.yourhost.com

这就是我在 apache2.conf 文件中添加的内容:

<VirtualHost *:80>

   ServerName depot.yourhost.com

   DocumentRoot "/home/gotqn/Aptana Projects/depot/public/"

   <Directory "/home/gotqn/Aptana Projects/depot/public">

      AllowOverride all

      Options -MultiViews

      Order allow,deny

      Allow from all

   </Directory>

</VirtualHost>

当我输入http://localhost/时,我的浏览器会列出“var\www”文件夹中的所有文件,当我输入http://depot.yourhost.com/时,它会显示以下错误:

我们很抱歉,但有些不对劲。

我检查了我的 rails 应用程序的 production.log 文件,它说:

连接到 database.yml 指定的数据库

在 2013-01-13 20:32:41 +0200 StoreController#index 处理为 127.0.0.1 开始 GET "/" 作为 HTML 在 3 毫秒内完成 500 内部服务器错误

ActiveRecord::StatementInvalid(找不到表'carts'):
app/controllers/application_controller.rb:46:in rescue in current_cart' app/controllers/application_controller.rb:44:in current_cart' app/controllers/store_controller.rb:11:in 'index'

我想我的数据库配置有问题,因为表存在但找不到。

无论如何,我的问题是主机文件如何知道“depot.yourhost.com”意味着打开 rails 应用程序和“localhost”确实列出了我的“var\www”文件夹 - 我认为 RoR 正在使用端口 3000。

为什么80端口没有冲突?

4

1 回答 1

1

使用轻量级 Webrick 服务器运行时,Rails 应用程序在端口 3000 下运行。由于您使用 mod_passenger 运行 Apache,因此根据您的 Apache 配置,该应用程序将在端口 80 上可用。

hosts 文件包含一个127.0.0.1 depot.yourhost.com将该域名定向到本地适配器 127.0.0.1 的条目。在需要咨询名称服务器以检索名称的地址之前,应始终检查主机文件。

接下来,您的 Apache 配置包括一个VirtualHost正在侦听所有网络适配器*

<VirtualHost *:80>

您的 Apache 配置必须设置为使用基于名称的虚拟主机,然后将变量与您的请求提供的请求标头ServerName匹配到.HTTP_HOSTdepot.yourhost.com

因此,您可以VirtualHost根据需要在同一 IP 地址上使用端口 80,Apache 将根据HTTP_HOST标头决定将请求路由到哪个。

DocumentRoot最后,mod_passenger 将通过检查您在 VirtualHost 配置中指定的目录内容来检测应用程序是否是 Ruby on Rails 应用程序。如果它找到public目录作为它的目录并且找到DocumentRoot更高级别的 RoR 应用程序,Passenger 将尝试启动 Rails 应用程序。

现在,至于为什么要从localhost...获取目录列表在您的 Apache 配置中的其他地方,您必须有一个VirtualHost与 匹配ServerName localhost并将其设置DocumentRoot/vart/www.

<VirtualHost *:80>
  ServerName localhost
  # or...
  ServerAlias localhost
</VirtualHost>

如果您看到列出的目录内容而不是403 Forbidden(没有类似的索引文件index.html),那是因为 Apache 服务器配置或VirtualHost配置不包含该指令:

Options -Indexes

在全局中添加它httpd.conf以防止在服务器范围内列出目录。

于 2013-01-14T19:05:39.303 回答