Rails - 没有路由匹配 [GET]“/index.html”(对于所有路由)

Rails - No route matches [GET] "/index.html" (For ALL Routes)

我第一次尝试将我的 Rails 应用程序部署到暂存环境。我很确定这是一个 Apache/Passenger 问题,但我什至不确定去哪里修复它。我可能只需要在我的 conf 文件中添加一个规则,但我不知道该规则是什么。也许是某种重写规则,因为它似乎在寻找文件而不是解析路由?

问题是:对于每条路线,似乎都将其 "behind the scenes" 转换为“/index.html”——无论我尝试“/api/v1”还是“[=29” =]/users”或“/api/v1/channels/authorize”(或任何其他)。

apache2/access.log 文件似乎显示正确传递的路由:

[07/Dec/2019:18:23:15 +0000] "GET /api/v1/channels/authorize HTTP/1.1" 500 41024 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"

并且 apache2/error.log 文件没有显示任何错误。


这是我的配置文件。我正在使用别名在两个单独的应用程序之间进行解析(/api/* 转到 Rails 后端,其他所有内容都转到 VueJS 前端——我知道我可以将客户端嵌入到Rails public 目录,但我这样做是出于我自己的原因)。

<VirtualHost *:443>
    ServerName <my url>
    DocumentRoot /path/to/client

     # configure error logs
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

     # Passenger config stuff
    PassengerEnabled off
    PassengerRuby /path/to/ruby
    PassengerAppEnv development
    PassengerStartTimeout 400


     # if the route matches https://<domain>/api/*
      # then point to the Rails API app
      # (and use Passenger to serve it)
    Alias /api /path/to/railsapp/public
     # configuration for the /api routes
      # basically just enable Passenger and tell it where to point to
    <Location /api>
        PassengerEnabled on
        PassengerBaseURI /
        PassengerAppRoot /path/to/railsapp
    </Location>
    <Directory /path/to/railsapp/public>
        Allow from all
        Options -MultiViews
        Require all granted

#       RailsEnv test
    </Directory>

     # for EVERYTHING ELSE, point to the VueJS client app
    <Location />
        RewriteEngine on
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule . /index.html [L]
    </Location>

     # and of course enable SSL and point to the certs
    SSLEngine on
    SSLCertificateKeyFile /path/to/key
    SSLCertificateFile /path/to/cert
    SSLCertificateChainFile /path/to/chain-file

</VirtualHost>

这是我第一次对 Passenger 做任何事情。我试图从我在网上找到的例子中拼凑一些东西,但很可能我在这个过程中遗漏了一些东西。

尝试将 <Location /api> 下的 PassengerBaseURI / 更改为 PassengerBaseURI /api

所以我想通了。以下块中的 RewriteRule 将应用于所有内容:

<Location / >
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule . /index.html [L]
</Location>

(Vue 中的每个路由都被重写回 index.html 文件——但 Rails 不会那样做)。

所以我尝试了一些不同的方法,最终发现我可以简单地向规则集添加一个 RewriteCond 来排除对 api/*

的所有调用

所以新区块是:

<Location / >
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !/api/*        ## THIS IS THE LINE TO ADD!
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule . /index.html [L]
</Location>

我必须添加到 apache conf 文件才能使其完美运行,只有这一行。