在我的 .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 中处理请求的顺序有点违反直觉:-)