我在routes.rb中尝试重写规则可能是不言自明的:
match "/:user/:photo-thumb.png" =>
redirect("/%{user}/photos/%{photo}/image?style=thumb"),
:photo => /[a-zA-Z]+/
我想将mysite.com/alice/foo-thumb.png之类的内容重定向到mysite.com/alice/photos/foo/image?style=thumb
但上述尝试是错误的。有任何修复它的想法吗?
答案 0 :(得分:4)
以下对我有用:
match "/:user/:photo_thumb.png" =>
redirect{|p|
"/#{p[:user]}/photos/#{p[:photo_thumb].split('-')[0]}/image?style=thumb"
},
:constraints => { :photo_thumb => /[a-zA-Z]*\-thumb/ }
我很想找到一种更简单的方法来做到这一点。 (正如tadman指出的那样,使用nginx重写可能会更好。请参阅此相关问题:Routes.rb vs rack-rewrite vs nginx/apache rewrite rules)
答案 1 :(得分:3)
你可能会有更多这样的运气:
match "/:user/:photo.png" =>
redirect("/%{user}/photos/%{photo}/image?style=thumb"),
:photo => /\w+\-thumb/
可以通过在其中添加其他内容来混淆路线令牌。
作为一个注释,这种事情通常在Web服务器级别上更好地处理,例如Apache,nginx或lighttpd,其中重定向不会占用Rails堆栈的实例。拥有大型映射表在具有大量遗留链接的应用程序中并不罕见。