1

我有一个想法将网站从 PHP(Joomla + 纯 php)移动到 Ruby on Rails(Refinery CMS)。旧网站有带有 .html 和 .php 扩展名的链接。有没有办法让旧网址保持不变(我不想失去 Google PageRank)?我尝试将 config.use_custom_slugs = trueconfig 与 Refenery 一起使用,但它删除了 '.' 从网址。(store.php变成storephp,也FAQ.html变成faqhtml......等)任何帮助表示赞赏!谢谢。

在 Rails 中,我可以用下一个方法

  #Application Controller
  def unknown_path
    #it works for all urls, here I can load page with needed slug
    render :text => "#{request.fullpath}"
  end

 #routes.rb
  match "*a", :to => "application#unknown_path" #in the end

它将使任何 url 工作。所以我可以使用自定义 slug 如果它存在或引发 404

但是 CMS 不允许创建真正自定义的 slug

为什么不是 301

试图解释:你得到一个外部链接到第 1 页,然后你的第 1 页在内部链接到第 2 页。第 1 页的链接从链接中获得 1000 个页面排名。指向第 2 页的链接得到 900 因此,指向 301 的链接得到 1000,而 301 指向的页面得到 900。所以:900 总比完全消失要好,但我正在努力避免造成这种情况。它是如何工作的。

4

2 回答 2

0

从 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

希望有帮助

于 2013-07-10T15:13:36.317 回答
0

根据我对炼油厂问题跟踪器的回答,也有人问过这个问题,你必须在 Rails 中这样做吗?在请求到达 Rails 之前使用代理软件(例如带有 HttpRewriteModule 的 nginx)重写请求怎么样?

于 2013-07-10T14:07:06.987 回答