RewriteMap 语法 Regex

RewriteMap 语法 Regex

在我的 .htaccess 中我有大量指令,使用相同的语法:

RewriteRule ^(.*)/PRODUCT_1.aspx http://www.site.com/product.php?id_product=2891
RewriteRule ^(.*)/PRODUCT_2.aspx http://www.site.com/product.php?id_product=2896

一切正常。现在,我在我的项目中创建了一个 RewriteMap,因为我需要提高速度(htaccess 中的 20.000 重定向 301 不行),因此:

RewriteEngine On
RewriteMap redirects dbm=db:/var/www/html/presta152/prestashop/redirects.db
RewriteCond ${redirects:$1} !=""
RewriteRule ^(.*)$ ${redirects:$1} [redirect=permanent,last]

我的redirects.db是由redirects.txt创建的,其中包含:

/PRODUCT_1.aspx http://www.site.com/product.php?id_product=2891
/PRODUCT_2.aspx http://www.site.com/product.php?id_product=2896

例如,如果我尝试调用 www.site.com/PRODUCT_1.aspx,则此方法有效,我被重定向...但如果我尝试调用 www.site.com/everythingpossibileinside/PRODUCT_1.aspx,则重定向无效。因此,在我的 .htaccess 中,此规则:

RewriteRule ^(.*)/PRODUCT_1.aspx http://www.site.com/product.php?id_product=2891

有效,但在我的 RewriteMap 中不行。我想我必须更改此指令:

RewriteRule ^(.*)$ ${redirects:$1} [redirect=permanent,last]

我试过了,但是没有成功。谢谢大家。

答案1

您需要像这样修改 RewriteRule:

RewriteRule (/[^/]*)$ ${redirects:$1} [redirect=permanent,last]

正则表达式 (/[^/]*)$ 将匹配带有前置反斜杠的整个 URI 中的“文件名”...然后 RewriteCond 将发生并测试重定向映射中是否存在这样的转换 - 如果是,则将发生重定向。

确实,mod_rewrite 中处理请求的顺序有点违反直觉:-)

相关内容