![如果未找到 REQUEST_URI,如何排除 RewriteMap](https://linux22.com/image/729960/%E5%A6%82%E6%9E%9C%E6%9C%AA%E6%89%BE%E5%88%B0%20REQUEST_URI%EF%BC%8C%E5%A6%82%E4%BD%95%E6%8E%92%E9%99%A4%20RewriteMap.png)
我有一个旧的 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
否则退出到 VirtualHost
如果 URLexample.com/xyz12345.htm
查找,xyzredirects.dbm
否则退出到 VirtualHost
如果网址example.com/abc12345.htm
不查找xyzredirects.dbm
如果网址example.com/xyz12345.htm
不查找abcredirects.dbm
如果网址example.com/hik12345.htm
不查看xyzredirects.dbm
或abcredirects.dbm
没有 .htaccess 不幸的是我不能使用 .htaccess
答案1
我不认为延迟是在RewriteMap
定义中,就在第一次调用查找时。因此,RewriteMap
可以在配置的顶部定义 s。
似乎没有必要使用<If>
条件,因为你可以(也应该)检查RewriteRule
图案。
在 vHost 中尝试以下操作:
RewriteEngine On
RewriteMap abcredirects "dbm:/etc/httpd/conf/dbm/abcredirects.dbm"
RewriteMap xyzredirects "dbm:/etc/httpd/conf/dbm/xyzredirects.dbm"
RewriteCond ${abcredirects:$1} !=""
RewriteRule ^(/abc.*) /${abcredirects:$1} [R=301,L]
RewriteCond ${xyzredirects:$1} !=""
RewriteRule ^(/xyz.*) /${xyzredirects:$1} [R=301,L]
不需要<IfModule>
容器(除非您的网站打算在没有 mod_rewrite 的情况下工作 - 但事实可能并非如此)。
这RewriteRule
图案首先处理。如果失败,则跳过前面的条件(查找重写映射),处理继续进行下一个RewriteRule
。
如果/abc12345.htm
字面上由数字组成,后跟.htm
扩展名,则将其包含在RewriteRule
正则表达式尽可能具体,避免不必要的查找。例如:
RewriteRule ^(/xyz\d+\.htm)$ /${xyzredirects:$1} [R=301,L]
测试前请确保浏览器缓存已清除。出于这个原因,使用 302(临时)重定向进行测试通常更容易。
但是,如果这一切都发生在新网站/服务器上,那么上述方法可能不是最好的方法,因为它会影响每个请求,包括对新页面和静态资源的所有请求。
对于这么多 URL,当您的网站已经确定它是 404 时,编写重定向脚本通常是更好的选择。只有在请求的后期阶段,您才应该在网站的数据库中查找新 URL 并触发重定向。这样就不会影响“正常”的网站性能。
更新:
abc 网址可能有多种不同的形式,
example.com/dir/dir/abc12345.htm
或example.com/abc12345.htm
或example.com/dir/dir/abc12345.xml
,example.com/dir/abc12345.xml
。网址中唯一不变的是abc
。
在这种情况下,更改RewriteRule
图案从^(/abc.*)
类似于:
RewriteRule (.*/abc.+\.(?:htm|xml))$ /${abcredirects:$1} [R=301,L]
如上所述,如果文件基本名称的其余部分(文件扩展名之前)始终由数字(0-9)组成,则更加具体,并匹配\d
而不是.
。或者,如果始终有 5 位数字(如您的示例中所示),则匹配\d{5}
。
请注意,以上内容捕获匹配的整个 URL 路径(例如/dir/dir/abc12345.htm
),然后将其作为参数传递给重写映射。
RewriteRule (.*/abc\d+\.(?:htm|xml))$ /${abcredirects:$1} [R=301,L]