我有一个旧网站 wordpress 网站,我正在迁移。
大约有 50000 个 URL 需要重定向。
为此,我正在使用似乎工作正常的 DBM 文件,但是在负载测试期间,我注意到每个请求都损失了大约 0.5 秒。
查看日志,看起来每次都有 50000 的 DBM 文件被命中。
我将 DBM 从 50000 更改为 10000,并注意到来自 50000 DBM 文件的每个请求我获得了大约 0.25 秒。
我希望能够做这样的事情,但是无论我如何混合和匹配代码,我都无法让它工作:
<If "%{REQUEST_URI} =~ m#^abc#">
RewriteMap abcredirects "dbm:/etc/httpd/conf/dbm/abcredirects.dbm"
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond ${abcredirects:$1} !=""
RewriteRule ^(.*) /${abcredirects:$1} [R=301,L]
</IfModule>
</If>
<If "%{REQUEST_URI} =~ m#^xyz#">
RewriteMap xyzredirects "dbm:/etc/httpd/conf/dbm/xyzredirects.dbm"
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond ${xyzredirects:$1} !=""
RewriteRule ^(.*) /${xyzredirects:$1} [R=301,L]
</IfModule>
</If>
使用上面的 sudo 代码我怎样才能让它工作?
IE。
如果 urlexample.com/abc12345.htm
查看abcredirects.dbm
else 退出到 VirtualHost
如果 urlexample.com/xyz12345.htm
查看xyzredirects.dbm
else 退出到 VirtualHost
如果网址example.com/abc12345.htm
不要查看xyzredirects.dbm
如果网址example.com/xyz12345.htm
不要查看abcredirects.dbm
如果 urlexample.com/hik12345.htm
不要查看xyzredirects.dbm
或abcredirects.dbm
NO .htaccess 不幸的是我不能使用 .htaccess
我认为延迟不在
RewriteMap
定义中,只是在第一次调用查找时。所以RewriteMap
s 可以在配置的顶部定义。似乎不需要使用
<If>
条件,因为您可以(并且应该)检查RewriteRule
pattern中的 URL-path 。在 vHost 中尝试以下操作:
不需要
<IfModule>
容器(除非您的网站打算在没有 mod_rewrite 的情况下工作 - 但情况可能并非如此)。首先处理
RewriteRule
图案。如果失败,则跳过前面的条件(查找重写映射)并继续处理下一个RewriteRule
。如果
/abc12345.htm
字面上由数字组成,后跟.htm
扩展名,则将其包含在RewriteRule
正则表达式中以尽可能具体并防止不必要的查找。例如:测试前请确保您的浏览器缓存已清除。出于这个原因,使用 302(临时)重定向通常更容易测试。
但是,如果这一切都发生在新网站/服务器上,那么上述方法可能不是最好的方法,因为它会影响每个请求,包括对新页面和静态资源的所有请求。
对于这么多 URL,当您的站点已经确定它是 404 时,通常最好编写重定向脚本。只有在请求的这个后期阶段,您才应该在站点的数据库中查找新 URL 并触发重定向。这样它就不会影响“正常”的网站性能。
更新:
在这种情况下,将
RewriteRule
模式从更改为^(/abc.*)
:如上所述,如果文件基名的其余部分(在文件扩展名之前)总是由数字(0-9)组成,那么更具体,匹配
\d
而不是.
. 或者,如果总是有 5 位数字(如您的示例中所示),则\d{5}
.请注意,上面捕获了匹配的整个 URL 路径(例如。
/dir/dir/abc12345.htm
),然后将其作为参数传递给您的重写映射。