Optimized httpd rewrite rules for 301 redirects

I am new to apache rewrite rules; I am writing the rules for 301 redirects for redirecting an old site's pages to new site. Please find below the rules --

#1
RewriteCond %{HTTP_HOST} ^(www-stage\.)?newsite\.com.au$ [NC]
RewriteCond %{REQUEST_URI} ^/a/b/c.html$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/x/y/z.html$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/p/q/r.html$ [NC]
RewriteRule (.*) /f/g/h.html [L,R=301]

#2
RewriteCond %{HTTP_HOST} ^(www-stage\.)?newsite\.com.au$ [NC]
RewriteCond %{REQUEST_URI} ^/q/w.html$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/i/n/s.html$ [NC]
RewriteRule (.*) /s/d/f/g.html [L,R=301]

for every new page; I am first matching the domain; and matching all the old pages' URL and redirecting to the new page's URL. There are around 120-130 urls that need to be redirected

Is this the correct way; or the rules can be made more optimized ?

-1
задан 1 December 2016 в 06:30
1 ответ

Это правильный способ ...?

Ну, может быть, но вы не совсем точно объяснили, что вы делаете и почему вы делаете это именно так.

  • Зачем нужно проверять HTTP_HOST ; у вас несколько доменов?
  • Перенаправление нескольких (кажущихся несвязанными) URL-адресов на один URL-адрес выглядит немного странно. На старом сайте не было канонических URL-адресов?
  • Вам нужно сопоставление без учета регистра?

  • Вы не экранируете все точки в регулярном выражении.
  • Вы не используете захваченные группа в шаблоне RewriteRule ; поэтому нет необходимости в группе захвата. т.е. (. *) должно быть просто . * . (Группы захвата / заключенные в скобки подшаблоны должны быть сохранены парсером регулярных выражений, так что если они не используются, это пустая трата времени.)

  • В вашем примере короткие URL-адреса, но было бы более эффективно сопоставить столько же, сколько и вы может в шаблоне RewriteRule , а не соответствовать REQUEST_URI в условиях . Шаблон RewriteRule обрабатывается первым, только если он совпадает с предыдущими директивами RewriteCond , обрабатываются. С использованием подстановочного знака соответствия всем (например, (. *) ) в шаблоне RewriteRule приводит к обработке каждого правила.

Таким образом, указанные выше перенаправления могут быть переписано (оптимизировано) как (игнорируя на данный момент проверку домена и предполагая, что NS не требуется):

#1
RewriteRule ^/(a/b/c|x/y/z|p/q/r)\.html$ /f/g/h.html [R=301,L]

#2
RewriteRule ^/(q/w|i/n/s)\.html$ /s/d/f/g.html [R=301,L]

Опять же, если вы еще не используете mod_rewrite для других целей, было бы «более оптимизировано» использовать mod_alias Вместо этого перенаправьте и / или RewriteMatch . Однако не смешивайте перенаправления от обоих модулей, так как вы можете получить неожиданные результаты. (Различные модули запускаются в разное время во время запроса, несмотря на их очевидный порядок в файле конфигурации.)

0
ответ дан 5 December 2019 в 20:26

Теги

Похожие вопросы