в моем .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 в моем, потому что мне нужно увеличить скорость (20.000 перенаправления 301 в htaccess бесполезны), поэтому:
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]
Я пробовал, но безуспешно. Спасибо всем.
Вам нужно изменить RewriteRule следующим образом:
RewriteRule (/[^/]*)$ ${redirects:$1} [redirect=permanent,last]
Регулярное выражение (/ [^ /] *) $ будет соответствовать «имени файла» из всего URI с предшествующей обратной косой чертой ... тогда будет выполнено RewriteCond и проверит, есть ли такой перевод в вашей карте перенаправления - если да, перенаправление состоится.
Действительно, порядок обработки запроса в mod_rewrite несколько нелогичен :-)