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

Как исключить RewriteMap, если REQUEST_URI не найден

У меня есть старый сайт wordpress, который я сейчас переношу.

Есть около 50000 URL-адресов, которые нужно перенаправить.

Для этого я использую файлы DBM, которые, похоже, работают нормально, однако во время нагрузочного тестирования я заметил, что теряю около 0,5 секунды на каждый запрос.

Просматривая журналы, похоже, что файл DBM с 50000 попадает каждый раз.

Я изменил DBM с 50000 на 10000 и заметил, что я выигрывал около 0,25 секунды на каждый запрос из файла 50000 DBM.

Я хотел бы иметь возможность сделать что-то подобное, однако независимо от того, как я смешиваю и сопоставляю код, я не могу заставить его работать:

<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 Как я могу заставить это работать?

т.е.

Если url example.com/abc12345.htm смотреть в abcredirects.dbm иначе выход на VirtualHost

Если url example.com/xyz12345.htm смотреть в xyzredirects.dbm иначе выход на VirtualHost

Если url example.com/abc12345.htm НЕ заглядывайте в xyzredirects.dbm

Если url example.com/xyz12345.htm НЕ заглядывайте abcredirects.dbm

Если url example.com/hik12345.htm НЕ заглядывайте xyzredirects.dbm или abcredirects.dbm

НЕТ .htaccess, к сожалению, я не могу использовать .htaccess

Оператор Apache If не работает

я не думай задержка в RewriteMap определение, как раз при первом вызове поиска. Так что RewriteMaps можно определить в верхней части вашей конфигурации.

Казалось бы, нет необходимости использовать <If> условие, так как вы можете (и должны) проверить URL-путь в 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-адрес в базе данных сайта и запускать перенаправление. Таким образом, это не влияет на "нормальную" производительность сайта.


ОБНОВИТЬ:

URL-адреса abc могут быть разными, example.com/dir/dir/abc12345.htm или example.com/abc12345.htm или example.com/dir/dir/abc12345.xml, example.com/dir/abc12345.xml. Единственная константа в URL-адресе будет 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]