从 wordpress 转移到 Comfortable Mexican Sofa(另一个 Rails CMS 引擎)时,我遇到了类似的问题。
我最终在我的 routes.rb 中执行了此操作(这里是其中一个重定向的示例(我没有很多 - 总共 15 个这样的重定向),这是 RefineryCMS 也可以使用的通用 Rails 解决方案我认为。
get '/2009/01/28/if-programming-languages-were-cars/', to: redirect('/blog/2009/01/if-programming-languages-were-cars-translated-into-russian')
这实际上会生成一个正确的重定向(不可能在浏览器中看到,但如果你 curl 你会看到:
curl http://gorbikoff.com/2009/01/28/if-programming-languages-were-cars/
<html>
<body>
You are being <a href="http://gorbikoff.com/blog/2009/01/if-programming-languages-were-cars-translated-into-russian">redirected</a>.
</body>
</html>
如果我们检查标题 - 我们会看到正确的 301 响应:
curl -I http://gorbikoff.com/2009/01/28/if-programming-languages-were-cars/
返回
HTTP/1.1 301 Moved Permanently
Content-Type: text/html
Content-Length: 158
Connection: keep-alive
Status: 301 Moved Permanently
Location: http://gorbikoff.com/blog/2009/01/if-programming-languages-were-cars-translated-into-russian
X-UA-Compatible: IE=Edge,chrome=1
Cache-Control: no-cache
X-Request-Id: 9ec0d0b29e94dcc26433c3aad034eab1
X-Runtime: 0.002247
Date: Wed, 10 Jul 2013 15:11:22 GMT
X-Rack-Cache: miss
X-Powered-By: Phusion Passenger 4.0.5
Server: nginx/1.4.1 + Phusion Passenger 4.0.5
具体到您的情况
所以这是一般的方法。但是,对于您正在尝试做的事情(将所有以 .php 结尾的网址(例如 yourdomain.com/store.php)重定向到 yourdomain.com/store),您应该能够执行类似的操作。这假设您将(准确映射您的新结构,否则您可能需要像我在开头提到的那样创建一堆自定义重定向或做一些正则表达式巫术):
非重定向解决方案
不要重定向用户,只需在同一地址呈现新页面(这是您在问题中提出的解决方案的一个转折):
如果您不想进行重定向,这是或多或少稳健的唯一方法。
# routes.rb
# You don't need to match for .html - as they will be handled automatically by rails.
match '/*\.php', to: "application#php_path"
# application_controller.rb
# This doesn't have to be application controller,
# you may do this in your home_controller if you wish.
def php_path
require 'open-uri'
file = open "http://#{request.host_with_port}#{request.fullpath.gsub!(/(.php)/,'')}"
render :inline => file.read
end
重定向解决方案:
根据 Google 301 是首选方式https://support.google.com/webmasters/answer/93633?hl=en。
match '/*\.php', to: redirect {|params, request|
"http://#{request.host_with_port}#{request.fullpath.gsub(/(.php)/,'')}"
}
这将提供一个响应标头状态代码 200。就全世界而言,您正在通过乘客服务 PHP(运行 curl -I 使用此示例 url 对我的网站 - 这些只是说明我的观点的任意参数)
curl -I http://gorbikoff.com/about?name=nick
curl -I http://gorbikoff.com/about.php?name=nick
您可能需要根据您的具体情况(https 与 http 等,并且可能需要单独处理一些虚拟路由。还要记住 route.rb 中的优先级),但我认为这可能对您有用。
编辑
我刚刚意识到这个解决方案在舒适的墨西哥沙发中开箱即用(它只是忽略了格式(.php 的处理方式与 .html 的处理方式相同)。但是我在我拥有的非基于 cms 的 rails 3 项目中尝试了我的解决方案(它不是公开的)并且我的解决方案仍然存在细微的变化 - 我只是修复了它(抱歉造成混淆)。
我还建议查看官方指南(我假设您使用的是 Rails 3.2.13,因为 RefinderyCMS 还没有正式支持 Rails 4)
http://guides.rubyonrails.org/v3.2.13/routing.html#redirection
并查看 Rails API
http://api.rubyonrails.org/v3.2.13/classes/ActionDispatch/Routing/Redirection.html#method-i-redirect
希望有帮助