Apache:处理数千个永久重定向的最佳方法是什么?


20

我们列出了3000 301个重定向。我们需要协助

  1. 放置这些物品的最佳地点是什么?在httpd.conf的vhost中放置这3000行似乎是一团糟。
  2. 建议使用什么方法来处理数千个网址?
  3. 这将对页面加载速度和apache服务器负载产生多大影响?

谢谢。

Answers:


29

您可以使用Include指令in httpd.conf来维护另一个文件中的重定向。但这不是非常有效,因为每个请求都需要对照许多正则表达式进行检查。此外,每次更改文件后都需要重新启动服务器。

进行大量重定向的更好方法是使用Type的RewriteMap指令dbm声明从URI到重定向的映射。这样,由于dbm查找非常快,因此效率很高,并且在更改映射后,您无需重启服务器即可httpd检查映射文件的修改时间。

重写规则如下所示(在我的Fedora 16计算机上测试):

RewriteEngine On
RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.db
RewriteCond ${redirects:$1} !=""
RewriteRule ^(.*)$ ${redirects:$1} [redirect=permanent,last]

dbm映射将从文本映射创建,/etc/httpd/conf/redirects.txt如下所示:

/foo http://serverfault.com/
/bar/lorem/ipsum/ http://stackoverflow.com/

使用命令

httxt2dbm -f db -i /etc/httpd/conf/redirects.txt -o /etc/httpd/conf/redirects.db

感谢您的回答。我尝试了一下,但遇到了错误:我的一行redirects.txt文件内容(用空格分隔的值)mydomain.com/experiment mydomain.com/new_page 它给我解析了'RewriteCond $ {redirects:$ 1}!=“” 。/usr/local/apache/conf/httpd.conf的第314行的语法错误:RewriteCond:错误的标志定界符我评论说,然后apache启动,但是访问mydomain.com/experiment(或来自mydomain的任何其他URL)给了我错误“正在以无法完成的方式重定向请求”。
ucker

Apache不会从上述代码片段重新启动。能否请你帮忙?我无法在任何日志文件中看到与此相关的任何错误。
ucker 2012年

我说它未经测试-我希望它需要一些调整。我以为就足够了,对不起。Httpd无法启动,因为!=和之间不能有空格""-我已将示例更正为可以运行且经过测试的版本。
2012年

还有一点评论:如果您的重定向需要依赖于查询字符串(?URL中的所有内容),需要使用其他方法,但这也是可能的。现在,它只需添加查询字符串即可重定向,例如http://yourserver.com/foo?q=bar将重定向到http://serverfault.com/?q=bar
2012年

感谢更新。RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.db给了错误RewriteMap dbm type db is invalid。但是,当我使用RewriteMap redirects txt:/etc/httpd/conf/redirects.txt它的时候。我仍然希望采用像您解释的哈希方式,而不是纯文本。但是我找不到太多有关dbm错误的信息。谢谢你的帮助。
ucker 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.