Редирект с помощью htaccess

KG
На сайте с 21.07.2008
Offline
35
3622

День добрый! Скажите пожалуйста, какие условия необходимо прописать в файл .htaccess чтобы решались две задачи:

1. Реализовать редирект со страниц без слеша на страницы со слешем (к примеру, редирект со страницы site.ru/categoria на страницу site.ru/categoria/)

2. Реализовать редирект с www на страницы без www (к примеру, редирект с www.site.ru на site.ru)

Сейчас файл .htaccess выглядит следующим образом:

AddDefaultCharset UTF-8

# Don't show directory listings for URLs which map to a directory.
Options -Indexes

# PHP 5, Apache 1 and 2.
<IfModule mod_php5.c>
php_flag magic_quotes_gpc off
php_flag magic_quotes_sybase off
php_flag register_globals off
</IfModule>


# Setting rewrite rules.
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
</IfModule>

С внутряков редиректит на site.ru/index.php . Подскажите, пожалуйста, в чем проблема.

В интернетах нашел следующие решения, но они тоже не работают.

Для первой задачи:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\..+$
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) http://www.site.ru/$1/ [R=301,L]

Для второй задачи:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+) [NC]
RewriteRule .* http://%1/$0 [L,R=301]

Не знаю важно это или нет, но хостинг Timeweb

siv1987
На сайте с 02.04.2009
Offline
427
#1
KindGhost:
В интернетах нашел следующие решения, но они тоже не работают.

Добавить поле RewriteBase / и будут работать.

KG
На сайте с 21.07.2008
Offline
35
#2

Т.е. файл должен быть следующего содержания?

AddDefaultCharset UTF-8


# Don't show directory listings for URLs which map to a directory.
Options -Indexes

# PHP 5, Apache 1 and 2.
<IfModule mod_php5.c>
php_flag magic_quotes_gpc off
php_flag magic_quotes_sybase off
php_flag register_globals off
</IfModule>


# Setting rewrite rules.
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\..+$
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) http://www.site.ru/$1/ [R=301,L]

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.+) [NC]
RewriteRule .* http://%1/$0 [L,R=301]
</IfModule>

Правильно?

siv1987
На сайте с 02.04.2009
Offline
427
#3
KindGhost:
Правильно?

Потому что вы там понаставили стопиццот RewriteEngine и RewriteBase-ов не правильно. У вас должен быть один RewriteEngine и один RewriteBase. И добавлять редиректы нужно после RewriteBase.


<IfModule mod_rewrite.c>
RewriteEngine on #один раз пишется
RewriteBase / #и это тоже пишется один раз

#редирект домена должен находиться в самом вверху
#перед остальными редиректами
RewriteCond %{HTTP_HOST} ^www\.(.+) [NC]
RewriteRule .* http://%1/$0 [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\..+$
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) /$1/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule mod_rewrite.c>
KG
На сайте с 21.07.2008
Offline
35
#4

Разместил ваш код:

AddDefaultCharset UTF-8


# Don't show directory listings for URLs which map to a directory.
Options -Indexes

# PHP 5, Apache 1 and 2.
<IfModule mod_php5.c>
php_flag magic_quotes_gpc off
php_flag magic_quotes_sybase off
php_flag register_globals off
</IfModule>


# Setting rewrite rules.
<IfModule mod_rewrite.c>
RewriteEngine on #один раз пишется
RewriteBase / #и это тоже пишется один раз

#редирект домена должен находиться в самом вверху
#перед остальными редиректами
RewriteCond %{HTTP_HOST} ^www\.(.+) [NC]
RewriteRule .* http://%1/$0 [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\..+$
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) /$1/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule mod_rewrite.c>

и сайт начал выдавать 500 ошибку:

Internal Server Error


The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, support@timeweb.ru and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.
siv1987
На сайте с 02.04.2009
Offline
427
#5

Вместо </IfModule mod_rewrite.c> - </IfModule>

И комментарий уберите после RewriteBase.

KG
На сайте с 21.07.2008
Offline
35
#6

Спасибо большое! Все заработало!

DH
На сайте с 08.02.2013
Offline
26
#7

Подскажите пожалуйста в коде

RewriteRule .* http://%1/$0 [L,R=301]

0 что означает, просто у меня стоит 1, вот мой код

RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

и ещё вопрос при наборе с WWW редиректин на главную страницу с /index.php, а можно как то прописать чтоб редиректил чисто на главную страницу?

RewriteRule ^([^/]*)/$ /index.php=$1 [L]

так не получилось

Увлечение (http://nash-fk.ru/)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий