如何防止我的 routes.rb 拦截对 /blog 的请求?
How do I prevent my routes.rb from intercepting requests coming to /blog?
我的 /blog
目录只是一堆静态 HTML 文件。不错。
当我转到 localhost/blog
时,它工作正常 - 它为我的中间人生成的博客呈现 index.html。太好了。
但是当我点击任何帖子时,它给我一个路由错误:
No route matches [GET] "/blog/2015/03/11/hello_world"
我很确定发生这种情况的原因是因为我的 routes.rb
:
中的这些规则之一
get '/:friendly_id', to: 'posts#show'
get '/rbt/:name', to: redirect {|path_params, _| "/#{path_params[:name].gsub(/^\d+\-/, '')}" }
get ':name', to: 'posts#show'
我需要所有这些路由,但我不希望 HTML 请求不必要地访问我的 Rack 中间件......或者更糟的是,执行数据库查询,这个错误似乎暗示是正在发生。
如何将对 /blog/
的所有请求限制为只解析到我的 public/blog/
目录?
编辑 1
我意识到上面的描述可能不是很清楚。我的 Rails 应用程序不是博客,因此您在上面看到的 posts
不是博客的帖子。它们是另一种帖子,由 Rails 应用程序和数据库等单独管理。我已经添加了一个真正的 /blog
,它只是 MiddleMan 生成的 HTML 文章的集合,将位于我的 Rails /public/blog
文件夹中。这个想法是我的 /blog
目录中的 HTML 文件根本不应该打到我的机架中间件。
当您的应用程序被网络服务器 运行 时,其网络根目录将是 public 目录。所以,如果你的博客目录在 public 目录中,这应该可以工作。 localhost/blog
使用以下配置尝试 运行 nginx
:
root /root/path/to/your_app/public;
您可以通过将 config.middleware.use Rack::Static, urls: ['/blog'], root: 'public'
添加到 config/application.rb 来强制 rack 将某些文件夹作为静态和路由忽略服务,但恕我直言,最好设置一个 Web 服务器以更早地拦截和服务 /blog比你的应用程序。
而且在你的情况下 /blog/2015/03/11/hello_world
似乎是一个目录名称,如果你将 index.html
添加到 link 它应该按你预期的那样工作,而无需更改任何配置。
你不能创建一个 static_url
控制器并配置你的路由以便
get '/blog', to: 'static_url#show'
然后在你的控制器中有
def show
render file: request.fullpath
end
抱歉,我现在无法测试,但我相信您已经明白了。另外,我猜你需要检测不存在的页面。
我的 /blog
目录只是一堆静态 HTML 文件。不错。
当我转到 localhost/blog
时,它工作正常 - 它为我的中间人生成的博客呈现 index.html。太好了。
但是当我点击任何帖子时,它给我一个路由错误:
No route matches [GET] "/blog/2015/03/11/hello_world"
我很确定发生这种情况的原因是因为我的 routes.rb
:
get '/:friendly_id', to: 'posts#show'
get '/rbt/:name', to: redirect {|path_params, _| "/#{path_params[:name].gsub(/^\d+\-/, '')}" }
get ':name', to: 'posts#show'
我需要所有这些路由,但我不希望 HTML 请求不必要地访问我的 Rack 中间件......或者更糟的是,执行数据库查询,这个错误似乎暗示是正在发生。
如何将对 /blog/
的所有请求限制为只解析到我的 public/blog/
目录?
编辑 1
我意识到上面的描述可能不是很清楚。我的 Rails 应用程序不是博客,因此您在上面看到的 posts
不是博客的帖子。它们是另一种帖子,由 Rails 应用程序和数据库等单独管理。我已经添加了一个真正的 /blog
,它只是 MiddleMan 生成的 HTML 文章的集合,将位于我的 Rails /public/blog
文件夹中。这个想法是我的 /blog
目录中的 HTML 文件根本不应该打到我的机架中间件。
当您的应用程序被网络服务器 运行 时,其网络根目录将是 public 目录。所以,如果你的博客目录在 public 目录中,这应该可以工作。 localhost/blog
使用以下配置尝试 运行 nginx
:
root /root/path/to/your_app/public;
您可以通过将 config.middleware.use Rack::Static, urls: ['/blog'], root: 'public'
添加到 config/application.rb 来强制 rack 将某些文件夹作为静态和路由忽略服务,但恕我直言,最好设置一个 Web 服务器以更早地拦截和服务 /blog比你的应用程序。
而且在你的情况下 /blog/2015/03/11/hello_world
似乎是一个目录名称,如果你将 index.html
添加到 link 它应该按你预期的那样工作,而无需更改任何配置。
你不能创建一个 static_url
控制器并配置你的路由以便
get '/blog', to: 'static_url#show'
然后在你的控制器中有
def show
render file: request.fullpath
end
抱歉,我现在无法测试,但我相信您已经明白了。另外,我猜你需要检测不存在的页面。