4

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

我想将旧网址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 每次都必须使用永久重定向。

4

2 回答 2

3

与其将两组 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 重定向而不是 mod_rewrite RewriteRule 进行调查,其中语法将是Redirect permanent #OldUrl# #NewUrl#- 因为 OldUrl 是一个精确的路径匹配,它可能会更快。

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

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

于 2012-10-11T13:57:26.917 回答
0

如果它们是静态重写,或者如果它们都遵循您可以在 .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。

于 2012-10-11T14:30:50.067 回答