快速参考:区域=门户网站类型页面。
我想要旧网址 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 /面积/ 12345-短标题
index.cfm将为内容提供服务或应用永久重定向,但它需要首先从数据库中获取标题和区域信息。
本网站共有50,000页。我还有其他关于子域重定向和永久子域的想法,并通过index.cfm控制它们的行为。
基础设施热衷于尽可能多地通过Apache重写,我们怀疑它会更快。但是,如果我们需要获取每个页面的区域和标题信息,我不确定我们是否有这个选择。
有没有人有这方面的经验可以提供输入?
-
需要注意的是,我假设我们必须以旧格式保留网站上使用的所有内部网址。改变它们将是一项巨大的工作。
这意味着每次内部网址都必须使用永久重定向。
答案 0 :(得分: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 /其他配置以支持/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重写完全正常,但可能存在一些限制(或至少需要拆分多个文件)。
答案 1 :(得分:0)
使用apache重写只会更快,如果它们是静态重写,或者它们都遵循一些规则,你可以在.htaccess文件中的正则表达式中编写。如果你不得不触摸这些重定向的数据库,那么在.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。