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 ?
Это правильный способ ...?
Ну, может быть, но вы не совсем точно объяснили, что вы делаете и почему вы делаете это именно так.
HTTP_HOST
; у вас несколько доменов? Вы не используете захваченные группа в шаблоне 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
. Однако не смешивайте перенаправления от обоих модулей, так как вы можете получить неожиданные результаты. (Различные модули запускаются в разное время во время запроса, несмотря на их очевидный порядок в файле конфигурации.)