如果未找到 REQUEST_URI,如何排除 RewriteMap

如果未找到 REQUEST_URI,如何排除 RewriteMap

我有一个旧的 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.dbmabcredirects.dbm

没有 .htaccess 不幸的是我不能使用 .htaccess

Apache If 语句不起作用

答案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.htmexample.com/abc12345.htmexample.com/dir/dir/abc12345.xmlexample.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]

相关内容