quick-ref:area=门户类型页面。
我想要旧网址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/drast/url/blah/blah/index.cfm?id=12345和http://domain.com/index.cfm/areace/1245短标题
index.cfm将为内容提供服务器或应用永久重定向,但它需要首先从数据库中获取标题和区域信息。
这个网站上有50000个页面。我也有其他的想法子域重定向,和永久子域和控制他们如何通过index.cfm.
基础设施热衷于通过Apache重写尽可能多的内容,我们怀疑它会更快。然而,如果我们需要获得每个页面的区域和标题信息,我不确定我们是否有这个选择。
有没有人在这方面有一些经验,可以提供意见?
--
需要注意的是,我假设我们必须保持网站上使用的所有内部URL的旧格式。这将是一项艰巨的工作来改变他们所有人。
这意味着所有内部URL每次都必须使用永久重定向。
与其将两组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重定向而不是mod_rewrite RewriteRule进行研究,其中语法为Redirect permanent #OldUrl# #NewUrl#
——由于OldUrl是一个完全匹配的路径,因此可能会更快。
请注意,在完成上述重定向.cfm重定向之前,需要检查这些规则-如果它们在同一.htaccess中,则不能简单地进行附加,但如果它们在站点的通用Apache配置文件中,则将首先检查.htaccess规则。
此外,根据Sharon的评论,您应该验证您的Apache是否能处理50k规则——虽然我看到有报道称"数千"个基于正则表达式的Apache重写非常好,但很可能有一些限制(或者至少需要在多个文件之间进行拆分)。
如果它们是静态重写,或者如果它们都遵循一些可以在.htaccess文件中用regex编写的规则,那么使用apache重写只会更快。如果你必须为这些重定向操作数据库,那么在.htaccess.中执行可能没有意义
另一种方法是大多数CMS用于处理虚拟目录和重定向的方法。站点根目录下的index.cfm文件处理所有传入的请求,并返回正确的页面和路径。MURA CMS使用这种方法(以及Joomla和大多数其他方法。)
基本上,您在传入请求中使用CGI.path_info变量,在DB中搜索它,并重定向到新路径。和往常一样,Ben Nadel很好地总结了如何使用这种方法:Ben Nadel:使用IIS URL重写和CGI.PATH_INFO与IIS MOD重写
但是,如果您想的话,您可以使用.htaccess将所有传入请求重定向到根url,并在.htaccess:中使用类似的内容来完全删除url字符串中的"index.cfm">
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.