在.htaccess中有一个巨大的重定向列表问题?

Mac*_*aca 5 .htaccess redirect

我想重定向每个301重定向,但我有超过3000个帖子.

如果我列出

Redirect permanent /blog/2010/07/post.html http://new.blog.com/2010/07/23/post/
Redirect permanent /blog/2010/07/post1.html http://new.blog.com/2010/07/24/post1/
Redirect permanent /blog/2010/07/post2.html http://new.blog.com/2010/07/25/post2/
Redirect permanent /blog/2010/07/post3.html http://new.blog.com/2010/07/26/post3/
Redirect per......
Run Code Online (Sandbox Code Playgroud)

对于.htaccess中超过3000 url redirect命令,这会占用我的服务器资源还是会导致一些问题?我不确定.htaccess是如何工作的,但如果服务器每次用户请求页面时都在查看这些列表,我猜它会是资源耗费的.

我无法使用RedirectMatch,因为我在新网址中添加了日期变量.您有重定向这些帖子的其他建议吗?或者我还好吗?

谢谢!

jos*_*736 7

我不是Apache专家,所以我不能说.htaccess中是否有3,000次重定向是一个问题(尽管我的直觉告诉我这可能是一个坏主意).但是,作为一个更简单的问题解决方案,为什么不使用mod_rewrite进行重定向?

RewriteRule ^/blog/(.+)/(.+)/(.+).html$ http://new.blog.com/$1/$2/$3/ [R=permanent]
Run Code Online (Sandbox Code Playgroud)

这使用正则表达式匹配旧URL并将其重写为新URL.该[R=permanent]指示的mod_rewrite默默内部重写请求发出新的URL 301来代替.

在您的示例中,您似乎已将帖子的日期添加到URL,旧URL中不存在该URL.由于你显然不能使用正则表达式来判断任意帖子的日期,这种方法可能对你不起作用.如果您可以从URL中删除一天,那么您就可以开始了.

编辑:我第一次看到你的问题,我错过了最后一段.("我不能使用RedirectMatch,因为我在新的url中添加了日期变量.")在这种情况下,您可以使用mod_rewrite的RewriteMap来查找帖子的日期组件.

您有两种选择:

  1. 使用散列映射在静态文件中执行快速查找.这意味着您的所有旧URL都可以使用,但是使用旧的URL方案无法访问任何新帖子.
  2. 使用脚本来抓住这一天.

在选项一中,创建一个名为posts.txt的文件并放入:

/yyyy/mm/pppp dd
Run Code Online (Sandbox Code Playgroud)

...对于每个帖子,其中yyyy是帖子的年份,mm是月份​​,pppp是帖子名称(没有.html).

完成后,运行:

$ httxt2dbm -i posts.txt -o posts.map 
Run Code Online (Sandbox Code Playgroud)

然后我们添加到服务器/虚拟服务器config :(注意路径是文件系统路径,而不是URL.)

RewriteMap postday dbm:/path/to/file/posts.map
RewriteRule ^/blog/(.+)/(.+)/(.+).html$ http://new.blog.com/$1/$2/${postday:$1/$2/$3}/$3/ [R=permanent]
Run Code Online (Sandbox Code Playgroud)

在选项二中,pgm:/path/to/script/lookup.whatever用作RewriteMap.有关使用脚本的更多信息,请参阅mod_rewrite文档.

在mod_rewrite中执行查找比仅重定向到查找日期然后重定向到最终目标的脚本更好,因为您不应该多次重定向.发出301或302会产生往返成本,这会增加页面加载时间的延迟.