【问题标题】:SEO URLs with ColdFusion controller?带有 ColdFusion 控制器的 SEO URL?
【发布时间】:2012-10-02 03:14:18
【问题描述】:

快速参考:区域 = 门户类型页面。

我想要旧网址 http://domain.com/long/rubbish/url/blah/blah/index.cfm?id=12345 重定向到 http://domain.com/area/12345-short-title

http://domain.com/area/12345-short-title 应该会显示内容。

到目前为止,我已经解决了这个问题,我可以使用 apache 将所有 URL 写入

http://domain.com/index.cfm/long/rubbish/url/blah/blah/index.cfm?id=12345 和 http://domain.com/index.cfm/area/12345-short-title

index.cfm 将提供内容或应用永久重定向,但它需要先从数据库中获取标题和区域信息。

本网站有 50,000 个页面。对于子域重定向和永久子域以及通过 index.cfm 控制它们的行为方式,我还有其他想法。

基础设施热衷于通过 Apache 重写来做尽可能多的事情,我们怀疑它会更快。但是,如果我们需要获取每个页面的区域和标题信息,我不确定我们是否有这种选择。

有没有人有这方面的经验可以提供意见?

--

需要注意的是,我假设我们必须将网站上使用的所有内部 URL 保留为旧格式。改变它们将是一项艰巨的工作。

这意味着所有内部 URL 每次都必须使用永久重定向。

【问题讨论】:

  • 您要处理多少个区域?这是一个相当静态的列表?
  • 嗯,有 100 个区域,有 50,000 页。它每天都在增长/变化。区域是太空任务,页面是这些任务的内容,并且“属于”特定区域。
  • 我不明白你说的是什么意思...需要先从数据库中获取地名和地区信息。” - 你为什么需要这些?
  • 如果有人尝试使用旧 URL domain.com/long/rubbish/url/blah/blah/index.cfm?id=12345 访问该网站,我希望他们会被重定向到新 URL。这是正常的事情吗?为此,“控制器”需要知道标题和区域名称。
  • 是的,当您发送 301 或 302 响应时,这就是您得到的。但是由于您有不同的 URL 格式,因此只需对旧 URL 进行查找。我没有看到将两种类型发送到单个 index.cfm 的好处

标签: apache mod-rewrite coldfusion friendly-url seo


【解决方案1】:

与其将两组 URL 重定向到同一个脚本,为什么不简单地将它们发送到两个不同的脚本?

就像这样:

RewriteCond ${REQUEST_URI}  !-f
RewriteRule ^\w+/\d+-[\w-]+$ /content.cfm/$0 [L]

RewriteCond ${REQUEST_URI}  !-f
RewriteRule ^.* /redirect.cfm/$0   [L,QSA]

然后,redirect.cfm 可以查找替换 URL 并执行 301 重定向,而 content.cfm 只是提供内容。

(您尚未指定 CF 的设置方式;您可能需要更新 Jrun/Tomcat/other 配置以支持 /content.cfm/*/redirect.cfm/* - 完成方式与完成方式相同对于 index.cfm)


出于性能原因,您仍然希望尽可能避免重定向数据库命中,您可以通过为在 Apache 端执行 301 重定向的每个页面生成重写规则来做到这一点。这可以像在 .htaccess 文件中添加一行一样简单,如下所示:

<cfset NewLine = 'RewriteRule #ReEscape(OldUrl)# #NewUrl#   [L,QSA,R=301]' />

<cffile action="append" file="./.htaccess" output=#NewLine# />

(OldUrl 和 NewUrl 是从数据库中查找到的。)

您可能还想使用 mod_alias redirect 而不是 mod_rewrite RewriteRule 进行调查,其中语法为 Redirect permanent #OldUrl# #NewUrl# - 因为 OldUrl 是完全匹配的路径,它可能会更快。

请注意,在完成上述 redirect.cfm 重定向之前,需要检查这些规则 - 如果它们在同一个 .htaccess 中,则不能简单地进行附加,但如果它们是在站点的通用 Apache 配置文件中,将首先检查 .htaccess 规则。

另外,根据 Sharon 的评论,您应该验证您的 Apache 是否会处理 50k 条规则 - 虽然我已经看到它报告说“数千”个基于正则表达式的 Apache 重写非常好,但可能会有一些限制(或至少需要拆分多个文件)。

【讨论】:

  • 谢谢,我会记住这一点。我更关心使用 ColdFusion 来完成我所描述的工作的性能和必要性。
  • 嘿,刚刚在编辑——一旦 CF 查找了 URL,它就不需要再做一次了——它可以将生成的规则附加到 .htaccess 文件中
  • 这很酷。但作为一个不得不处理生成的 .htaccess 文件的人,如果我打开一个缓存了 50,000 个可能 URL 的重定向文件,我会吓坏。这让我想知道您在一个 .htaccess 中可以拥有的重定向规则的数量是否存在理论上和/或实际的限制。
  • 另外,不要忘记在所有这些写入和读取时适当使用
  • 好吧,对于一个知名网站 (see last para),当然有可能拥有“数千个基于正则表达式的重写规则”,但是,如果这可能是一个问题,值得调查。另外,我怀疑(一旦生成/识别了所有规则)可能会以某种方式压缩它们 - 理论上每个区域而不是每页只需要一个规则,因此可能有某种方法可以显着减少它。
【解决方案2】:

只有当它们是静态重写,或者它们都遵循您可以在 .htaccess 文件中用正则表达式编写的某些规则时,使用 apache 重写才会更快。如果您必须为这些重定向访问数据库,那么在 .htaccess 中执行此操作可能没有意义。

另一种方法是大多数 CMS 用于处理虚拟目录和重定向的方法。站点根目录的 index.cfm 文件处理所有传入请求并返回正确的页面和路径。 MURA CMS 使用这种方法(以及 Joomla 和大多数其他方法。)

基本上,您在传入请求中使用 CGI.path_info 变量,在您的数据库中搜索它,并重定向到新路径。像往常一样,Ben Nadel 写了一篇关于如何使用这种方法的文章:Ben Nadel: Using IIS URL Rewriting And CGI.PATH_INFO With IIS MOD-Rewrite

但是,如果您愿意,您可以使用 .htaccess 从 url 字符串中完全删除“index.cfm”,方法是将所有传入请求重定向到根 URL,并在 .htaccess 中使用如下所示的内容:

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^([a-zA-Z0-9-]{1,})/([a-zA-Z0-9/-]+)$ /$1/index.cfm/$2 [PT]

基本上,这会将http://www.yourdomain.com/your-new-url/ 之类的内容重定向到http://www.yourdomain.com/index.cfm/your-new-url/,可以按照上面的博客文章所述进行处理。用户永远不会看到 index.cfm。

【讨论】:

  • 谢谢,我看过本的文章。我的“问题”描述了 /index.cfm/ 的使用,我希望使用 CGI.PATH_INFO。所以我认为你所描述的是我已经打算做的。有趣的是,在尝试了 Mura 之后,我对最终实施 SEO URL 解决方案产生了浓厚的兴趣。那我打算解决网站被许多子域索引的问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 2016-01-18
相关资源
最近更新 更多