Ruby on rails 我如何防止我的routes.rb拦截到/blog的请求?
我的Ruby on rails 我如何防止我的routes.rb拦截到/blog的请求?,ruby-on-rails,ruby-on-rails-4,routing,rack,middleman,Ruby On Rails,Ruby On Rails 4,Routing,Rack,Middleman,我的/blog目录只是一堆静态HTML文件。那很好 当我转到localhost/blog时,它工作正常-它为我的中间人生成的blog呈现index.html。太好了 但当我点击任何帖子时,它会给我一个路由错误: No route matches [GET] "/blog/2015/03/11/hello_world" 我很确定发生这种情况的原因是因为我的路线中有一条规则。rb: get '/:friendly_id', to: 'posts#show' get '/rbt/:name'
/blog
目录只是一堆静态HTML文件。那很好
当我转到localhost/blog
时,它工作正常-它为我的中间人生成的blog呈现index.html。太好了
但当我点击任何帖子时,它会给我一个路由错误:
No route matches [GET] "/blog/2015/03/11/hello_world"
我很确定发生这种情况的原因是因为我的路线中有一条规则。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请求不必要地击中我的机架中间件……或者更糟糕的是,执行此错误似乎表明正在发生的DB查询
如何将所有请求限制在/blog/
目录中,以便仅解析到我的public/blog/
目录
编辑1
我意识到上面的描述可能不清楚。我的Rails应用程序不是博客,因此上面提到的
帖子
不是博客帖子。它们是另一种帖子,由Rails应用程序使用DB和all分别管理。此后,我添加了一个真正的/blog
,它将只是由生成的HTML文章的集合,这些文章将放在我的Rails/public/blog
文件夹中。我的想法是,我的/blog
目录中的HTML文件根本不应该击中我的机架中间件。当你的应用程序由webserver运行时,它的webroot将是公共目录。所以,如果你有你的博客目录在公共目录内,这应该是可行的<代码>本地主机/博客
尝试使用以下配置运行nginx
:
root /root/path/to/your_app/public;
您可以通过向config/application.rb添加
config.middleware.use rack::static,URL:['/blog'],root:'public'
,强制rack将某些文件夹作为静态文件夹提供服务,并忽略路由,但我认为最好在您的应用程序之前设置一个web服务器来拦截和提供/blog
另外,在您的情况下,
/blog/2015/03/11/hello_world
似乎是一个目录名,如果您将index.html
添加到链接中,它应该按照您的预期工作,而不更改任何配置。您不能创建一个静态url
控制器并配置您的路由以便
get '/blog', to: 'static_url#show'
然后在你的控制器中
def show
render file: request.fullpath
end
对不起,我现在不能测试,但我相信你明白了。另外,我想你需要检测不存在的页面。你能提供你的帖子url吗?@Arv哪个帖子url?不知道你的意思。你在哪个帖子上点击,这会给你一个错误。我不会点击任何帖子。我的网站有帖子,这与我试图设置的博客是分开的。文章不是博客的子对象。这是两件不同的事情。post是由Rails管理的资源。我新的
博客
位于/blog
是一组由Middleman(类似于Octopress)编译的静态生成的HTML页面。请尝试使用类似.HTML
的扩展名。因为你似乎只是在生成html文件并将其放入公用文件夹,不是吗?是的,我同意。它应该会起作用。但事实并非如此,因为我在上面的问题中指定了路由规则。好的,首先,为什么要在根级别定义路由提取参数?我想你也会遇到问题,比如get'/:friendly\u id',to:'posts#show'
和get:name',to:'posts#show'
。我不认为你能够绕过机架中间件,最好在某些资源名称下定义这些路由。e、 g.get'/posts/:friendly_id',to:'posts#show'
,这不仅仅是因为你没有其他选择。但这条路线将更具描述性,并正确地表示资源。我认为更干净的方法。Rack::Static
的建议非常有趣。它可以工作是的,但正如你所说的……最好让服务器来做,而不是机架中间件。使用index.html
不起作用,因为请求永远不会到达我的public
文件夹。它只是被重定向到我的路由器。我知道,因为我试过了。是的,这可能行得通,但这里的问题是,它需要所有HTML请求不必要地命中我的机架中间件。如果可以的话,我正试图完全避免这种情况。