RewriteRule: перенаправить старые пути на сервер архивации и канонизировать в домен без www? - PullRequest
0 голосов
/ 27 февраля 2011

Я перенесу старый сервер на archive.example.com, и новый сервер продолжит работу на example.com, в то время как все URL-адреса www будут канонизированы для example.com или archive.example.com и должны иметь проблема с косой чертой.

На старом сервере есть много каталогов, поэтому все нужно перенаправить на archive.example.com, сохранив информацию о пути, за исключением нескольких каталогов, которые будут работать на новом сервере. Каталоги, которые я НЕ хочу перенаправлять и останутся для нового сервера:

/ (root)
/static
/blog
/about

Например:

example.com => example.com 
www.example.com => example.com
www.example.com/ => example.com/

example.com/blog => example.com/blog
www.example.com/blog => example.com/blog
www.example.com/blog/ => example.com/blog/

Все остальные каталоги должны перенаправляться на archive.example.com. Например:

example.com/docs => archive.example.com/docs
www.example.com/docs => archive.example.com/docs
www.example.com/docs/ => archive.example.com/docs/

example.com/library/images => archive.example.com/library/images
www.example.com/library/images => archive.example.com/library/images
www.example.com/library/images/ => archive.example.com/library/images/

Вот что у меня в файле httpd.conf:


ServerName example.com
ServerAlias www.example.com
UseCanonicalName On

# canonicalize www.example.com to example.com
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ $1 [R=301]

# redirect everything to archive.example.com except for a few directories
RewriteCond  %{REQUEST_URI} !^(/|/static|/blog|/about)$
RewriteRule ^/(.*)$ http://archive.example.com/$1  [NC,R=301,L]

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

Ответы [ 2 ]

0 голосов
/ 27 февраля 2011

Кажется, я нашел свою проблему - именно с RewriteRule, который перенаправил на старый сайт.

Вот что у меня было, когда я отправил вопрос:


# redirect everything to archive.example.com except for a few directories
RewriteCond  %{REQUEST_URI} !^(/|/static|/blog|/about)$
RewriteRule ^/(.*)$ http://archive.example.com/$1  [NC,R=301,L]

... и я переписал это:


# redirect everything to archive.example.com except for a few directories
RewriteCond  %{REQUEST_URI} !^/$
RewriteCond  %{REQUEST_URI} !^/static.*$
RewriteCond  %{REQUEST_URI} !^/blog.*$
RewriteCond  %{REQUEST_URI} !^/about.*$
RewriteRule ^(.*)$ http://archive.example.com%{REQUEST_URI}  [NC,R=301,L]

Вот почему.

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

Вы также заметите, что после / static, / blog / и / about я добавил точку-звездочку, чтобы она соответствовала любому пути в этих каталогах, а не только верхнему уровню.

Наконец, в строке RewriteRule я удалил начальную косую черту из шаблона и изменил конечный / $ 1 на% {REQUEST_URI}. Мне не нужно хранить здесь какие-либо переменные из шаблона - мне просто нужно изменить имя сервера - поэтому вместо извлечения пути из шаблона я сделал его более явным, используя ту же самую переменную% {REQUEST_URI}, которая был использован в предыдущих четырех строках.

Кстати: одна из причин, по которой это сначала вызывало у меня путаницу, заключалась в том, что Chrome иногда кэшировал информацию о DNS / пути - выполнение Ctrl-F5 для очистки кэша позволит вам увидеть ваши изменения.

0 голосов
/ 27 февраля 2011
RewriteEngine On
RewriteCond %{HTTP_HOST} !^gotactics.net$ [NC]
RewriteRule ^(.*)$ http://gotactics.net/$1 [L,R=301]

Это удалит все www. Я уверен, что вы можете изменить это тоже сделать иначе, если нужно.

...