2011-06-29 4 views
8

Я знаю, что в Stackoverflow есть много примеров, но я все еще что-то пропустил.htaccess: перенаправить старый домен и все страницы в новый домен

Я пытаюсь перенаправить 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

ответ

9

При написании правил 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 флага n RewriteRule.

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


Пока мы на эту тему, как часть выпуска EE 2.2, EllisLab сейчас «официально» предлагает ограниченную техническую поддержку removing index.php from ExpressionEngine URLs.

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

<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

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

# 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

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

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

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 не может проверить домен запроса в запросе.

Смежные вопросы