За последние 24 часа нас посетили 60624 программиста и 1743 робота. Сейчас ищут 912 программистов ...

Как добавить слеш в конец url через htaccess ?

Тема в разделе "PHP для новичков", создана пользователем Khaybulla, 13 апр 2016.

Метки:
  1. Khaybulla

    Khaybulla Активный пользователь

    С нами с:
    4 мар 2016
    Сообщения:
    89
    Симпатии:
    2
    Вот мой код что нужно добавить или переделать что бы в конце url ставился слеш ?

    Код (Text):
    1. <IfModule mod_rewrite.c>
    2.     RewriteEngine on
    3.     RewriteBase /
    4.     RewriteCond %{HTTP_HOST} ^khaybulla
    5.     RewriteRule (.*) http://www.khaybulla.ru/$1 [R=301,L]
    6.     RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
    7.     RewriteRule ^index\.php$ http://www.khaybulla.ru/ [R=301,L]
    8.     RewriteCond %{REQUEST_FILENAME} !-f
    9.     RewriteCond %{REQUEST_FILENAME} !-d
    10.     RewriteCond %{REQUEST_FILENAME}.php -f
    11.     RewriteRule ^.*$ $0.php [L,QSA]
    12.     RewriteCond %{THE_REQUEST} ([^\s]*)\.php(\?[^\s]*)?
    13.     RewriteRule (.*) %1 [R=301,L]
    14. </IfModule>
     
    #1 Khaybulla, 13 апр 2016
    Последнее редактирование модератором: 13 апр 2016
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    можно несколько примеров желаемого превращения "было" в "стало"?
     
  3. Khaybulla

    Khaybulla Активный пользователь

    С нами с:
    4 мар 2016
    Сообщения:
    89
    Симпатии:
    2
    Да конечно, сейчас у меня http://www.khaybulla.ru/registration а надо http://www.khaybulla.ru/registration/ в конце просто что бы слеш был.
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    второй наводящий вопрос: нужно редирект пользователя сделать к новому адресу или рерайт перед заправкой в пхп-машину?
     
  5. Khaybulla

    Khaybulla Активный пользователь

    С нами с:
    4 мар 2016
    Сообщения:
    89
    Симпатии:
    2
    нужно сделать редирект что бы автоматически слеш в конце ставился
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Код (Text):
    1. RewriteCond %{REQUEST_URI} !(.*)/$
    2. RewriteRule ^(.*)$ http://www.khaybulla.ru/$1/ [L,R=301]
     
  7. Khaybulla

    Khaybulla Активный пользователь

    С нами с:
    4 мар 2016
    Сообщения:
    89
    Симпатии:
    2
    Можно поточней это нужно добавить или заменить на что то и на что именно ?
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Добавить или заменить - полностью зависит от логики тех правил, которые уже прописаны в аксес-файле. Или с этим тоже помощь нужна будет?
     
  9. Khaybulla

    Khaybulla Активный пользователь

    С нами с:
    4 мар 2016
    Сообщения:
    89
    Симпатии:
    2
    Да так как я пробую добавлять и заменять но все равно не корректно работает...
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Ну как сказать... Работает корректно, просто не соответствует Вашей логике. Включите отладку рерайтера, сделайте пару запросов и потом почитайте в журнале всю логику его работы. Потом проведите рефакторинг существующих правил для достижения нужного результата.
     
  11. Khaybulla

    Khaybulla Активный пользователь

    С нами с:
    4 мар 2016
    Сообщения:
    89
    Симпатии:
    2
    Когда просто твой код вставляю слеш добавляется но страница не правильно отображается можешь помочь настроить под мой код ?
    Код (Text):
    1. <IfModule mod_rewrite.c>
    2.     RewriteEngine on
    3.     RewriteBase /
    4.     RewriteCond %{HTTP_HOST} ^khaybulla
    5.     RewriteRule (.*) http://www.khaybulla.ru/$1 [R=301,L]
    6.     RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
    7.     RewriteRule ^index\.php$ http://www.khaybulla.ru/ [R=301,L]
    8.     RewriteCond %{REQUEST_FILENAME} !-f
    9.     RewriteCond %{REQUEST_FILENAME} !-d
    10.     RewriteCond %{REQUEST_FILENAME}.php -f
    11.     RewriteRule ^.*$ $0.php [L,QSA]
    12.     RewriteCond %{THE_REQUEST} ([^\s]*)\.php(\?[^\s]*)?
    13.     RewriteRule (.*) %1 [R=301,L]
    14. </IfModule>
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Могу. Опиши логику своего кода.
     
  13. Khaybulla

    Khaybulla Активный пользователь

    С нами с:
    4 мар 2016
    Сообщения:
    89
    Симпатии:
    2
    Указано две склейки: khaybulla.ru и www.khaybulla.ru для того что бы перебрасывало 301 редиректом на www.khaybulla.ru
    И если пользователь наберет www.khaybulla.ru/index.php тоже перебрасывает 301 редиректом на www.khaybulla.ru
    Убран формат файла в конце url например было www.khaybulla.ru/registration.php стало www.khaybulla.ru/registration
    И теперь нужно что бы в конце www.khaybulla.ru/registration становился слеш автоматически вот так www.khaybulla.ru/registration/
     
  14. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Код (Text):
    1. # РУТИНЫ БЕЗ-ВВВ-НА-ВВВ
    2. #
    3. # проверяем отсутствие префикса WWW-точка в имени хоста
    4. RewriteCond %{HTTP_HOST} ^khaybulla\.ru$
    5. # перенаправляем на WWW-точка-и-так-далее
    6. RewriteRule .* http://www.khaybulla.ru/$1 [R=301,L,QSA]
    7.  
    8. # РУТИНЫ ОБРАЩЕНИЯ К КОРНЕВОМУ ИНДЕКС.ПХП
    9. #
    10. # проверка прямого обращения к /index.php и редикрет на корень хоста
    11. RewriteRule ^/index\.php$ http://www.khaybulla.ru/ [R=301,L,QSA]
    12.  
    13. # РУТИНЫ РЕДИРЕКТА С ДОТ-ПХП НА АДРЕС БЕЗ РАСШИРЕНИЯ
    14. #
    15. # проверяем отсутствие внутреннего перенаправления
    16. # (иначе разрешение, например, /test/ в /test.php попадет сюда и уйдет в бесконечный цикл)
    17. RewriteCond %{ENV:REDIRECT_STATUS} ^$
    18. # провеяем что полное разрешенное имя файла заканчивается на дот-пхп
    19. RewriteCond %{REQUEST_FILENAME} ^(.*)\.php$
    20. # перенаправляем на тот же адрес, заменяя дот-пхп на слэш
    21. RewriteRule .* %1/ [R=301,L,QSA]
    22.  
    23. # РУТИНЫ ОБЯЗАТЕЛЬНОГО ЗАВЕРШАЮЩЕГО СЛЭША
    24. # (для адресов не попавших под правило "редиректа с дот-пхп..."
    25. #
    26. # проверяем отсутствие внутреннего перенаправления
    27. # (иначе разрешение, например, /test/ в /test.php попадет сюда и уйдет в бесконечный цикл)
    28. RewriteCond %{ENV:REDIRECT_STATUS} ^$
    29. # проверяем что запрошенный адрес не завершается слэшем
    30. RewriteCond %{REQUEST_URI} !^.*/$
    31. # перенаправляем на тот же адрес, но с завершающим слэшем
    32. RewriteRule (.*) $1/ [R=301,L,QSA]
    33.  
    34. # РУТИНЫ НАПРАВЛЕНИЯ ЗАПРОСОВ К СУЩЕСТВУЮЩИМ ПХП-ФАЙЛАМ
    35. #
    36. # проверяем присутствие завершающего слэша
    37. RewriteCond %{REQUEST_URI} ^(.*)/$
    38. # проверяем существование пхп-файла, путь к которому составлен из
    39. # адреса запроса с заменой завершающего слэша на расширение пхп
    40. RewriteCond %{DOCUMENT_ROOT}/%1.php -f
    41. # направляем запрос к такому существующему файлу
    42. RewriteRule .* %1.php [L,QSA]
    * тестировалось на Apache/2.4.7
    * не рассматривались ситуации редиректа отсутствующих файлов и каталогов куда-то еще
     
  15. Khaybulla

    Khaybulla Активный пользователь

    С нами с:
    4 мар 2016
    Сообщения:
    89
    Симпатии:
    2
    Сейчас у меня открывается страница так http://www.khaybulla.ru/Z:/home/khaybulla.ru/www/registration/ а должно быть так www.khaybulla.ru/registration/
    И теперь на главное странице www.khaybulla.ru не отображаются стили
    И нет перенаправления со страницы www.khaybulla.ru/index/ должно перенаправляться на www.khaybulla.ru а сейчас когда открываю страницу index показывает так http://www.khaybulla.ru/Z:/home/khaybulla.ru/www/Z:/home/khaybulla.ru/www/index/
     
  16. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Хм... Как это у меня копипаст не удался...
    Код (Text):
    1. RewriteCond %{REQUEST_FILENAME} ^(.*)\.php$
    должно быть
    Код (Text):
    1. RewriteCond %{REQUEST_URI} ^(.*)\.php$
    В условиях задачи про этот момент не было сказано. Решается добавлением проверки существования файла/каталога в рутину добавления слэша:
    Код (Text):
    1. RewriteCond %{ENV:REDIRECT_STATUS} ^$
    2. RewriteCond %{REQUEST_URI} !^(.*)/$
    3. RewriteCond %{REQUEST_FILENAME} !-f
    4. RewriteCond %{REQUEST_FILENAME} !-d
    5. RewriteRule (.*) $1/ [R=301,L,QSA]
    В условиях задачи про этот момент не было сказано. Перенаправляли же с /index.php. Лечится элементарным патчем регулярного выражения:
    Код (Text):
    1. RewriteRule ^index(\.php|/)$ http://www.khaybulla.ru/ [R=301,L,QSA]
     
  17. Khaybulla

    Khaybulla Активный пользователь

    С нами с:
    4 мар 2016
    Сообщения:
    89
    Симпатии:
    2
    Чет я совсем запутался )
    Можешь собрать код тот что в итоге должен получиться ?
     
  18. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Ты издеваешься? Заменить одну строку на другую не можешь? Ты кстати поудалял свои старые правила? Это бесполезный мусор, который не работает. Нужно просто оставить моё произведение искусства.
     
  19. Khaybulla

    Khaybulla Активный пользователь

    С нами с:
    4 мар 2016
    Сообщения:
    89
    Симпатии:
    2
    Поудалял))
    Просто работает не совсем корректно поэтому попросил скинуть как должно быть может я что то неправильно вставляю.

    Вот ща у меня так:
    Код (Text):
    1. RewriteEngine on
    2.     RewriteCond %{HTTP_HOST} ^khaybulla\.ru$
    3.     RewriteRule .* http://www.khaybulla.ru/$1 [R=301,L,QSA]
    4.     RewriteRule ^index(\.php|/)$ http://www.khaybulla.ru/ [R=301,L,QSA]
    5.     RewriteCond %{ENV:REDIRECT_STATUS} ^$
    6.     RewriteCond %{REQUEST_URI} ^(.*)\.php$
    7.     RewriteRule .* %1/ [R=301,L,QSA]
    8.     RewriteCond %{ENV:REDIRECT_STATUS} ^$
    9.     RewriteCond %{REQUEST_URI} !^(.*)/$
    10.     RewriteCond %{REQUEST_FILENAME} !-f
    11.     RewriteCond %{REQUEST_FILENAME} !-d
    12.     RewriteRule (.*) $1/ [R=301,L,QSA]
    13.     RewriteCond %{REQUEST_URI} ^(.*)/$
    14.     RewriteCond %{DOCUMENT_ROOT}/%1.php -f
    15.     RewriteRule .* %1.php [L,QSA]
    Собрал вроде как ты сказал но теперь другие проблемы:
    Пропали стили с тех страниц где на конце слеш / а на главное уже показывает нормально.
    И не перенаправляет автоматически на слеш например когда пишешь www.khaybulla.ru/registration а должно перенаправлять на www.khaybulla.ru/registration/
    А остальное работает
     
  20. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    У меня работает всё как требовалось. Я не знаю, что ты делаешь не так. Включи отладку, почитай логику рерайта.
    Ну и в конце концов, не забывай тестировать с отключенный браузерным кэшем.
     
  21. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну тут произведение искусства Ganzal не причём - вы стили не от корня указываете. А раз вы поставили слеш на конце, для браузера это - папка. Т.е.
    HTML:
    1.  
    2. <!-- Правильно -->
    3. <link href="/path/to/styles/style.css" rel="stylesheet">
    4.  
    5. <!-- Не правильно -->
    6. <link href="path/to/styles/style.css" rel="stylesheet">
    7.  
     
    Khaybulla нравится это.
  22. Khaybulla

    Khaybulla Активный пользователь

    С нами с:
    4 мар 2016
    Сообщения:
    89
    Симпатии:
    2
    Спасибо -1 проблема )

    Может и с этим поможешь ?
    когда в ввожу www.site.ru/authorization меня перебрасывает на страницу http://www.site.ru/Z:/home/site.ru/www/authorization/
    а надо что бы перенаправляло на слеш например ввожу www.site.ru/authorization что бы перенаправляло на www.site.ru/authorization/
     
  23. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Не, тут пусть автор шедевра htaccess помогает. Я бы просто на 100% по-другому сделал, но вы уже написали так, как написали...
     
  24. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    в исправленной версии все работает. оно и до этого работало, просто я каким-то чудом при копипасте опечатался.
     
  25. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ganzal, не сомневаюсь. Скорее всего, у ТС кеша в браузере. Или ещё как-то мне перезапуск сервера помог завести исправленный htaccess.