Назад | Перейти на главную страницу

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 в моем, потому что мне нужно увеличить скорость (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 несколько нелогичен :-)