Очень нужна помощь по обратному слешу (htaccess).

B
На сайте с 04.12.2008
Offline
69
1415

Здравствуйте

Очень нужна оценка директив по перенаправлению в htaccess

Откликнувшимся заранее большое спасибо.

Задачи:

  • без www
  • без index.html
  • site.ru/dir -> site.ru/dir/
  • страницы и файлы page.html/ -> page.html

Чтоб соблюсти все требования перелопатил кучу страниц. Результат не очень.

Хостер подсказал решение (ниже). Но у меня сомнения, так htaccess для меня труден:

  • не ли лишних/ненужных перенаплавлений?
  • будет ли нормально работать данный код с ЧПУ? (к сожалению сейчас не проверить)
  • правильно ли перенаправление для файлов и страниц (с /) на (без /) ?

Оцените пожалуйста решение и универсальность его работы.

Заранее всем откликнувшися большое спасибо!

RewriteCond %{HTTP_HOST} ^www\.site\.ru$ [NC]

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

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/
RewriteRule ^index\.html$ http://site.ru [R=301,L]

RewriteCond %{REQUEST_URI} !^/index\.html$ [NC]
RewriteRule ^(.*\.html)/$ $1 [R=301,L]

PS
До этого пробовал применять еще одно.
Но оно работает 50 на 50, хотя мне очень нравится
- не нужно прописывать домен
- комментарии к директивам, понятно что к чему

# исключаем файлы

RewriteCond %{REQUEST_FILENAME} !-f
# исключаем символьные ссылки
RewriteCond %{REQUEST_FILENAME} !-l
# исключаем файлы index.php
RewriteCond %{REQUEST_URI} !index.html
# исключаем uri содержащие точки, для пропуска ссылок на файлы
RewriteCond %{REQUEST_URI} !\.[^./]+$
# исключаем uri со слешем на конце
RewriteCond %{REQUEST_URI} !(.*)/$
# 301 перенаправление на запрос со слешем в конце
RewriteRule ^(.*)$ $1/ [R=301,L]

<IfModule mod_rewrite.c>
RewriteCond %{HTTPS} !=on
# no www
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
# no index.html
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/
RewriteRule ^index\.html$ / [R=301,L]
</IfModule>

Еще раз спасибо!

siv1987
На сайте с 02.04.2009
Offline
427
#1

#1

RewriteCond %{HTTP_HOST} ^www\.site\.ru$ [NC]

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

#2

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php|html)\ HTTP/

RewriteRule ^index\.(php|html)$ http://site.ru/? [R=301,L]

#3,4

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^([^.]+)(?</)$ /$1/ [R=301,L]

RewriteRule ^(.+\.html)/+$ /$1 [R=301,L]

B
На сайте с 04.12.2008
Offline
69
#2
siv1987:
#1
RewriteCond %{HTTP_HOST} ^www\.site\.ru$ [NC]
RewriteRule ^(.*)$ http://site.ru/$1 [R=301,L]

#2
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php|html)\ HTTP/
RewriteRule ^index\.(php|html)$ http://site.ru/? [R=301,L]

#3,4
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^.]+)(?</)$ /$1/ [R=301,L]
RewriteRule ^(.+\.html)/+$ /$1 [R=301,L]

Спасибо.

Но предпоследняя строка (RewriteRule ^([^.]+)(?</)$ /$1/ [R=301,L])

Вызывает 500ю ошибку

:(

Почему так/можно ли это исправить?

Спасибо!

gormarket
На сайте с 29.12.2010
Offline
47
#3
blacks:
Спасибо.
Но предпоследняя строка (RewriteRule ^([^.]+)(?</)$ /$1/ [R=301,L])
Вызывает 500ю ошибку

Наверно автор хотел использовать т.н. утверждение "(?<!/)",

т.е проверку что последний символ перед этим утверждением не слеш

но возможно в Apache такой синтаксис регулярных выражений не поддерживается.

Можно воспользоваться таким вариантом добавления завершающего слеша если URL не содержит точки и не заканчивается слешем

RewriteRule ^([^.]+)([^./]+)$ /$0/ [R=301,L]

Товары и цены в магазинах Вашего города: Городской рынок (http://gormarket.ru/)
siv1987
На сайте с 02.04.2009
Offline
427
#4

Да, (?</) исправьте на (?<!/)

gormarket:
но возможно в Apache такой синтаксис регулярных выражений не поддерживается.

поддерживается

Pattern is a perl compatible regular expression,
B
На сайте с 04.12.2008
Offline
69
#5

Спасибо.

Но:

- при запросе site.ru/dir/txt.txt/ - кидает на 404

Хотя по идее стоит строка RewriteCond %{REQUEST_FILENAME} !-f

Пробовал добавить

# исключаем uri содержащие точки, для пропуска ссылок на файлы

RewriteCond %{REQUEST_URI} !\.[^./]+$

# исключаем uri со слешем на конце
RewriteCond %{REQUEST_URI} !(.*)/$

- не помогло

😕

gormarket
На сайте с 29.12.2010
Offline
47
#6
blacks:
- при запросе site.ru/dir/txt.txt/ - кидает на 404

Хотя по идее стоит строка RewriteCond %{REQUEST_FILENAME} !-f

Правильно кидает

site.ru/dir/txt.txt/

это не файл, а папка

и такой папки у Вас нет !!!

А корректной обработки подобного URL в данном топике не показано

(есть только обработка URL типа "page.html/"),

да и у Вас в .htaccess очевидно тоже нет.

наверно для "site.ru/dir/txt.txt/" (да и для любого URL заканчивающегося на "имя_точка_расширение_слеш") должно быть что-то типа

RewriteRule ^(.*[^./]+\.[^./]+)/+$ /$1 [R=301,L]

B
На сайте с 04.12.2008
Offline
69
#7
gormarket:
Правильно кидает
site.ru/dir/txt.txt/
это не файл, а папка
и такой папки у Вас нет !!!

А корректной обработки подобного URL в данном топике не показано
(есть только обработка URL типа "page.html/"),
да и у Вас в .htaccess очевидно тоже нет.

наверно для "site.ru/dir/txt.txt/" (да и для любого URL заканчивающегося на "имя_точка_расширение_слеш") должно быть что-то типа
RewriteRule ^(.*[^./]+\.[^./]+)/+$ /$1 [R=301,L]

site.ru/dir/txt.txt = это как раз файл "txt.txt" (существующий)

нужно чтоб ссылка site.ru/dir/txt.txt/ редиректила на данный файл (site.ru/dir/txt.txt)

Извините, наверно я не очень конкретно описал:

"страницы и файлы page.html/ -> page.html" (написано 1м посте)

- тут про файлы и хотел написать

Попробовал добавить ваш пример

- по прежнему site.ru/dir/txt.txt/ - 404 ошибка

(site.ru/dir/txt.txt - открывает нормально)

:o:confused:

siv1987
На сайте с 02.04.2009
Offline
427
#8
Извините, наверно я не очень конкретно описал:
"страницы и файлы page.html/ -> page.html" (написано 1м посте)
- тут про файлы и хотел написать

RewriteRule ^(.+\.html)/+$

замените на

RewriteRule ^(.+\.[^/]+)/+$

Регулярка у gormarket тоже рабочая, так что если работать не будет, капайте htaccess или ищите проблему в настройках сервера

B
На сайте с 04.12.2008
Offline
69
#9

Спасибо большое.

Оказалось что хостинг виноват:

у него статический контент отдается nginx'ом, вне апача + nginx'a кеширует урл.

= получается что если даже вписать правильный код в хтаццесс он не сработает (отдаст кеш 404)

= результатов изменения приходится ждать 20-60минут!

Поэтому прошу siv1987

- можете выложить конечный вариант, рабочий, с всеми правками?

- потому как в попытках правок вроде я совершил ошибку

Сейчас код в хтассессе (на основе вашего первого +исправления)


RewriteCond %{HTTP_HOST} ^www\.site\.ru$ [NC]
RewriteRule ^(.*)$ http://ripmagazine.ru/$1 [R=301,L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php|html)\ HTTP/
RewriteRule ^index\.(php|html)$ http://site.ru/? [R=301,L]

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

все работает кроме одного:

http://www.site.ru/file/txt.txt/ -> http://site.ru/file/txt.txt (все правильно)

а когда без слеша в конце:

http://www.site.ru/file/txt.txt -> http://www.site.ru/file/txt.txt (нет перенаправления на без www)

- но с html страницами такого не происходит.

К сожалению проверить все варианты кода не получается из-за кеша и времени его ожидания

Большое человеческое спасибо!!!

PS
на основе данного топика пробовал кучу вариаций.
в результате запутался - вставлял правки по коду кажись не в те строчки
вот что пробовал (последние 2 строки):


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

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

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

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

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