У меня есть старый сайт 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
я не думай задержка в RewriteMap
определение, как раз при первом вызове поиска. Так что RewriteMap
s можно определить в верхней части вашей конфигурации.
Казалось бы, нет необходимости использовать <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]