htaccess: перенаправить старый домен и все страницы на новый домен - PullRequest
8 голосов
/ 29 июня 2011

Я знаю, что на Stackoverflow есть много примеров, но я все еще что-то упускаю.

Я пытаюсь перенаправить http://old.domain.com/fr/ на http://brand.new -domain.com /fr / со следующими правилами, но это не работает:

# Enable Rewrite Engine
RewriteEngine On
RewriteBase /

# Add a trailing slash to paths without an extension
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule ^(.*)$ $1/ [L,R=301]

# Redirect domain
Options +FollowSymLinks
RewriteCond %{HTTP_HOST} ^old.domain.com [OR]
RewriteCond %{HTTP_HOST} ^other-old.domain.com [NC]
RewriteRule ^(.*)$ http://brand.new-domain.com/$1 [r=301,L]

# Remove index.php
# Uses the "exclude method"
# http://expressionengine.com/wiki/Remove_index.php_From_URLs/#Exclude_List_Method
# This method seems to work best for us, you might also use the include method.
# http://expressionengine.com/wiki/Remove_index.php_From_URLs/#Include_List_Method
# Exclude root files
RewriteCond $1 !^(index\.php) [NC]
# Exclude EE folders
RewriteCond $1 !^(assets|ee-admin|images|templates|themes|fr|nl)/ [NC]
# Exclude user created folders
RewriteCond $1 !^(assets|css|img|js|swf|uploads)/ [NC]
# Exlude favico, robots, ipad icon
RewriteCond $1 !^(favicon\.ico|robots\.txt|pple-touch-icon\.png) [NC]
# Remove index.php
RewriteCond %{QUERY_STRING} !^(ACT=.*)$ [NC]
RewriteCond %{QUERY_STRING} !^(URL=.*)$ [NC]
RewriteRule ^(.*)$ /index.php?/$1 [L]

Он правильно перенаправляет при вызове корневого URL, но не при вызове страницы.Что я делаю не так?

Заранее спасибо!

Pv

Ответы [ 3 ]

9 голосов
/ 29 июня 2011

При написании mod_rewrite правил правила применяются в том порядке, в котором они появляются.

Чтобы перенаправить старый домен на новый домен, нужно, чтобы это правило было первым в вашем файле .htaccess или httpd.conf - все остальные правила должны появиться после него.

Если вы хотите перенаправить только определенную директорию , это сделает следующее правило:позволяя остальной части сайта функционировать нормально:

<IfModule mod_rewrite.c>
    RewriteEngine On

    # Redirect Only Matching Directories
    RewriteCond %{REQUEST_URI} ^/(fr|fr/.*)$
    RewriteRule ^(.*)$ http://brand.new-domain.com/fr/$1 [R=301,L]
</IfModule>

Если вы хотите перенаправить весь сайт, это будет выполняться по следующему правилу:

<IfModule mod_rewrite.c>
    RewriteEngine On

    # Redirect Entire Site to New Domain
    RewriteCond %{HTTP_HOST} ^old.domain.com$ [OR]
    RewriteCond %{HTTP_HOST} ^other-old.domain.com$ [NC]
    RewriteRule ^(.*)$ http://brand.new-domain.com/$1 [R=301,L]
</IfModule>

Если вы хотите разрешитьсканеры знают, что ваш контент перемещен, и хотят сделать переход как можно более плавным, обязательно сохраняйте флаг 301 Redirect в RewriteRule.

Это гарантирует, что пользователи и поисковые системы будутнаправлено на правильную страницу.


Пока мы обсуждаем эту тему, в рамках выпуска EE 2.2 EllisLab теперь "официально" предлагает ограниченную техническую поддержку для удаления index.php из ExpressionEnURL-адреса gine .

Просто добавьте или обновите свой код в соответствии со следующими правилами, следя за тем, чтобы учесть все правила, которые у вас уже есть:

<IfModule mod_rewrite.c>
    RewriteEngine On

    # Removes index.php
    RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php/$1 [L]

    # If 404s, "No Input File" or every URL returns the same thing
    # make it /index.php?/$1 above (add the question mark)
</IfModule>
3 голосов
/ 29 июня 2011

Попробуйте использовать следующую строчку в качестве первого:

# Redirect domain
Options +FollowSymLinks
RewriteCond %{HTTP_HOST} ^old.domain.com [OR]
RewriteCond %{HTTP_HOST} ^other-old.domain.com [NC]
RewriteRule ^(.*)$ http://brand.new-domain.com/$1 [R=301,L]

Также обратите внимание на верхний регистр R с - это краткая форма для нижнего регистра redirect.

1 голос
/ 30 июня 2011

Вы пытались использовать mod_alias простые инструкции по перенаправлению (у вас есть модуль ядра), прежде чем пытаться использовать hacky-mod-rewrite?

Я бы сделал VirtualHost с ServerName old.domain.com и в этом VH я бы добавил это правило:

Redirect /fr http://brand.new-domain.com/fr

из doc:

Тогда любой запрос, начинающийся с URL-Path, вернет запрос перенаправления клиенту нарасположение целевого URL.Дополнительная информация о пути помимо сопоставленного URL-пути будет добавлена ​​к целевому URL.

Так что получите отдельный VirtualHost для brand.new-domain.com (с ServerName brand.new-domain.com) и в этом выполните:не устанавливать правило перенаправления.

Если вы по-прежнему хотите обрабатывать 2 домена в одном VirtualHost, вам придется использовать mod-rewrite, так как даже RedirectMatch не может проверить домен запроса в запросе.

...