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

Как удалить/добавить слэш в конце URL через .htaccess

Как удалить/добавить слэш в конце URL через .htaccess

Наверняка, многие из Вас понимают, что в большинстве случаев «http://mysite.ru/dir» и «http://mysite.ru/dir/» откроют одно и то же. Но это лишь в большинстве случаев, а не всегда. Если идёт обработка REQUEST_URI через PHP, то там может иметь огромное значение наличие или отсутствия слэша в конце URL. И очень важно привести весь сайт к единому стандарту, чтобы было либо со слэшем на конце, либо без. Вот как удалить слэш на конце URL через .htaccess, а также как его добавить, я расскажу в этой статье.

Я приведу 2 кода, один всегда удаляет слэш на конце URL, а другой всегда добавляет. Начнём с 1-го варианта:

RewriteEngine On
RewriteBase /
RewriteCond % (.*)
RewriteCond % /$ [NC]
RewriteRule ^(.*)(/)$ $1 [L,R=301]

Теперь если пользователь введёт «http://mysite.ru/dir/» его автоматически перенаправит на «http://mysite.ru/dir«. Разумеется, все GET-параметры сохранятся. Например, если пользователь вводил: «http://mysite.ru/dir/?a=5&b=7«, то его перенаправит по такому адресу «http://mysite.ru/dir?a=5&b=7«.

А сейчас давайте рассмотрим вариант, когда нам обязательно нужен слэш в конце URL, то есть чтобы при вводе «http://mysite.ru/dir» был автоматический переход на «http://mysite.ru/dir/«:

RewriteEngine On
RewriteBase /
RewriteCond % !-f
RewriteCond % !(.*)/$
RewriteRule ^(.*[^/])$ $1/ [L,R=301]

С этим кодом в .htaccess слэш будет добавляться автоматически в конце URL.

Теперь Вы знаете, как удалять и добавлять слэш в конце URL через .htaccess. И Вам нужно лишь определиться, какой вариант Вам больше нравится, потому что никакой принципиальной разницы между ними нет.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

Комментарии ( 13 ):

Скажите, а можно через ".htaccess" удалить расширения файлов, к примеру было mysite.php а стало просто mysite?

Здравствуйте, а как убрать расширение файла и добавить слеш в конце? Делаю так RewriteEngine on RewriteBase / RewriteCond % ^www.malinichev.ru$ [NC] RewriteRule ^(.*)$ http://malinichev.ru/$1 [R=301,L] RewriteCond % !-f RewriteCond % !(.*)/$ RewriteRule ^(.*[^/])$ $1/ [L,R=301] RewriteRule ^(([^/]+/)*[^.]+)$ /$1.php [L] но получается malinichev.ru/pass/.php/ как сделать нормально? Скажите пожалуйста

Добрый день. Была такая проблема, слеш на конце ссылок. Все сделал как вы написали..все работает. Но перестало заходить в админку. Joomla. там видимо на конце тоже слеш. Как быть в таком случае?

Как быть в таком случае? Не использовать CMS.

"На этой странице обнаружена циклическая переадресация" круто работает — не работает!

Скажите, а как мне добавить слеш в конце для opencart, данный код не работает

Здравствуйте. Подскажите пожалуйста в следующей ситуации: Есть вёрстка html5+CSS Первоначально была задача, избавиться через .htaccess от расширения php на конце URL Для этого прописал в .htaccess следующее: RewriteEngine On RewriteCond % !-f RewriteCond % !-d RewriteCond %.php -f RewriteRule ^.*$ $0.php [L,QSA] RewriteCond % ([^\s]*)\.php(\?[^\s]*)? RewriteRule (.*) %1 [R=301,L] Всё заработало отлично! Но, при постепенном наполнении сайта контентом возникла следующая ситуация: Есть страница http://мойсайт/razdel1 Получить для дочерней страницы родителем которой является razdel1 новый URL допустим http://мойсайт/razdel1/katalog Для этого в корневой директории сайта создаю разумеется директорию razdel1 в неё копирую индексный файл, и меняю основной контент, после чего переименовываю файл под таким именем katalog.php На выходе я получаю мою новую страницу http://мойсайт/razdel1/katalog и всё отлично на конце нет слэша изначально это добивалось. Но пеерстала работать старница под этим URL http://мойсайт/razdel1 Точнее открывается содержимо директории razdel1 а мне нужно чтобы открывался по прежнему файл из осноной директории razdel1.php Посоветуйте что можно сделать чтобы открывались обе страницы по желаемым мне URL адресам Пробовал вариант когда в директории razdel1 создаю индексный файл и он открывает всё верно, и вторая новая страница работает, но открытие этой страницы http://мойсайт/razdel1 содержит на конце слэш а он по всему сайту не нужен… как в таком случае от него можно избавиться, и при этом переадресация с .php на без слэша тоже сохранилась?

Здравствуйте! Подскажите, пожалуйста, как сделать исключения для страниц с Get параметрами: т.е., везде на сайте со слешем в конце url, а на страницах с Get параметрами — без. Например: www.site.ru/catalog/ и www.site.ru/login (уже без слеша), чтобы можно было добавлять страницы в такие исключения. Спасибо!

Читайте также:  Тест по физике Видимое движение светил 8 класс

Добрый день. Подскажите, что может быть не так — использовал ваши рекомендации по удалению слеша. Результат такой: www.site.ru/catalog, а вот для главной такой — www.site.ru/ Не убирается слеш индексной страницы.

Тя кто моды учил писать!? Не парь людям мозги, чтоб они потом сайты не лопатили, искали ошибку. НАРОД, КТО JOOMLA ИСПОЛЬЗУЕТ . Не вздумайте вставить эту ахинею, если у вас регистрация присутствует. RewriteCond % (.*) RewriteCond % /$ [NC] RewriteRule ^(.*)(/)$ $1 [L,R=301]

Ребят, скажите, а реально сделать, чтобы http://site.ru/contacts.php открывался как http://site.ru/contacts/ Т.е ссылка то выглядит как ссылка на директорию contacts, но это файл. Или по старинке в папку contacts поместить index.php?

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

Источник

Вопросительный знак (‘?’) В URL-адресах запрещает блокировку кода htaccess

Я хочу заблокировать кого-то, используя этот динамический URL-адрес:

Каждый раз появляется новый IP-адрес, но следующая часть URL-адреса всегда одинакова /%24%24%24%26%3f%26%3f%24%24%24?cmd=get_file&arg=images/wslogo_block_page.png&sid= .

Код ниже будет работать нормально, если бы он не был для ? в URL-адресе (см. URL-адрес выше), он винтов все в порядке. Я попытался включить ‘?’ в правиле перезаписи ниже, но это не помогает.

Как мне обращаться с ? (вопросительный знак) в этих URL-адресах, чтобы я мог их заблокировать? Спасибо.

2 ответа

Код ниже будет работать нормально, если бы он не был для ? в URL .

? в указанном вами URL-адресе знаменует начало строки запроса . Чтобы соответствовать строке запроса, вам нужно использовать переменную сервера QUERY_STRING в mod_rewrite условие . ( RewriteRule pattern соответствует только URL-адресу — это исключает строку запроса.)

Похоже, вы пытаетесь заблокировать любой запрос, который просто содержит cmd=get_file где угодно внутри строки запроса. Для этого вам понадобится следующее:

Флаг L не требуется. Это подразумевается при использовании флага F . regex cmd=get_file совпадает с ^.*cmd=get_file.*$ . Если этого достаточно, остановитесь там.

Однако это гораздо более общий, чем вы заявили в первой части вашего вопроса:

. следующая часть URL-адреса всегда одинакова /%24%24%24%26%3f%26%3f%24%24%24?cmd=get_file&arg=images/wslogo_block_page.png&sid=

Чтобы соответствовать этому конкретному URL-адресу (игнорируя любые возвращаемые параметры строки запроса), вам потребуется что-то вроде:

«Сложная» часть этого соответствия соответствует URL-адресу (т.е. /%24%24%24%26%3f%26%3f%24%24%24 ). Шаблон RewriteRule совпадает с URL-адресом с URL-адресами, который является /$$$&?&?$$$ (предполагая, что ранее опубликованный URL не был дважды закодирован или что-то еще). Смутно, это также содержит ? и другие метасимволы регулярных выражений, поэтому они должны быть обратными слэшами, экранированными в регулярном выражении, которые соответствуют этим буквальным символам.

Просто добавьте примечание, если вы тестируете это на Microsoft Windows (в отличие от Linux) . URL-код, закодированный ? (т.е. %3f ) в URL-пути приведет к созданию системы 403 Запрещено в Apache Windows до mod_rewrite /.htaccess может обрабатывать URL-адрес. Это связано с тем, что ? не является допустимым символом имени под Windows (тогда как $ , & являются «ОК»). Произошла ошибка, подобная следующей: если установлен соответствующий уровень отладки:

Источник

ЧПУ .htaccess и знак вопроса

Доброго времени суток.
Ищу совет, помощь и решение такой проблемки)
Что есть.
В броузере http://127.0.0.1/-exit
в .htaccess правило
RewriteRule ^-([a-zA-Z0-9]+)$ index.php?view=main&act=$1
парсит, и выводит на страничку
view=main&act=exit
Все гуд и хорошо, так и должно быть.
Вопрос, как написать правило что бы заменить — на ?
если делаем так
http://127.0.0.1/?exit
в .htaccess
^\?([a-zA-Z0-9]+)$ index.php?view=main&act=$1
ответ получаем на страничке
view=main а
&act=exit куда то отваливается.

в пхп данные выводятся командой print $_SERVER["QUERY_STRING"]

Где грабли лежат)?

Откажитесь от использования знака вопроса. Используйте тире, как в Вашем первом примере, или какой-нибудь другой символ.

Если это страничка, значит она существует на сервере.
Например

перенаправит все запросы к несуществующим файлам на сервере на файл dispetcher.php. В параметре q сохранится весь путь.
Тогда ваш запрос можно представить в виде

переменная q=/main/exit.
Этот путь можно превратить в переменные

2 Филипп Ткачев
Я разбираю сточку в .htaccess

и передаю уже разобраную строку в index.php

в пхп парсингом не занимаюсь, это реализовано в .htaccess
Вы наверно не поняли сути вопроса

  1. Знак вопроса адресной строке броузера. Выяслин, так не получится.

как разобрать где запрос на просмотр, а где команда на исполнение (выход)
у меня пока такое решение

обе строки парсятся как
view=main&act=exit

на исполнение файла/функии

Андрей [досье] , я понял, что вы делаете. Я не могу вникнуть в тайный смысл ваших действий.
Какая разница между

С точки зрения моей логики — никакой. Если страницы содержат операции, то нет смысла для них делать ЧПУ. Путь к странице должен быть путем, а операция — параметрами.
По своей сути ЧПУ предполагает иерархию и задуман для того, чтобы пользователь мог стереть кусочек пути и подняться уровнем выше.

Читайте также:  Ведение бюджета как говорить о деньгах до свадьбы и после

Кстати мой вышеприведенный пример позволяет сделать так

В обработчике вы можете сами решить, что вы делаете. Это гораздо более гибкая схема, нежели ваша.

И почему вы не хотите обрабатывать данные в скрипте? Даже если скрипт готовый, всегда можно добавить пару нужных строк в него.

2 Филипп Ткачев

Учусь), пишу сам)
1.

На сколько я понял суть .htaccess, .htaccess примит параметры до ?, и проигнорирует строку с параметрами после ?.
На что и указывает в посте выше Иванов Михаил aka Ivanych.
2.

Дейсвие на стронице почти всегда какое то есть, допустим добавить пост.
Вопрос в том как это предаставить.
3.

Так и задумано, + еще пользователь может писать команду в страке броузера на исполнение
Допустим

и допуситим означает выход из залогиненого юзера
стирание sport/ из

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

как определить?
— где команда будет act=exit
— где запрос на просмотр сраницы /main/act/exit
если совпадет по названиям просматривыемый каталог(станица) с командой (допустим act), что тогда?
жестко прописывать правила? теряется гибкость.

Так и задумано, + еще пользователь может писать команду в страке броузера на исполнение
Допустим

Андрей [досье] , я считаю, что вы сейчас запутываете сами себя.

Различаются кодом символа. Да это ведь разные переменные. Но получить их имена не составляет труда, поверьте.
Зато

превращается в изящное (и на которое всем наплевать, как и на строку выше)

  1. Да, проигнорирует.
  2. Действие есть не всегда. Работать с ним удобнее, применяя метод POST.
  3. Пользователю всегда лень. Помните об этом.
  4. Согласен, не гибко. Однако вероятность совпадения с командой мала. И лечится очень легко. А правильное продумывание структуры сайта вообще имеет положительный момент.

я не знаю как это сделать через знак ? в .htaccess, это было основой вопрос

Паральельно будет возможность посылать данные методами POST и GET, и возможноть применять Ajax технологии. Все эти возножности уже за выбором от конкретной ситуации. Я хочу предоставить эти возможности.

бр. а зачем вообще придумали такое понятие как ЧПУ?
По моему

лучше смотрится чем

или я не прав? или вы про что?

веб-адреса, удобные для восприятия человеком

и удалит не тот пост? Или просто перепутает страницу? ЧПУ ведь подталкивает к вводу 😉

А вообще про то, что надо действие представлять действием!
Т.е. на странице

должны быть кнопки [Добавить],[Исправить],[Удалить].
После нажатия на одну из них, в сценарий будет передано значение действия методом POST в виде

Внешне ссылка ничуть не изменится, а действие будет выполнено. Это примитивная защита от неправильных действий пользователя.

Или представим другую ситуацию. Оформление заказа в несколько этапов.
Этапы должны выполняться строго один за другим и тут, во избежание соблазна, пользователь не должен видеть в строке адреса шаг, на котором он находится.
Все просто и прозрачно.

).
вроде мы говорим про одно и тоже. но друг друга недопонимаем
это делается для удобства и возможностей создания страниц/скриптов в дальнейшем, на данном этапе такая задача не стоит
На выбор разработчику (не секретарше) будет предложены варианты манипулирования с дейсвтиями, как и куда их тыкать и как представлять (кнопочкой, ссылкой, чем то еще), какими методами пересылать данные (POST, GET, или пользуя ajax (jquery, prototype, самописные функции..)) . Этим будет в дальнейшем заниматься тот человек, который на базе этой писанины что я пробую сделать (если получится =) ), будет писать модули под конкретные задачи.
То есть ему решать

должно ли act=delpost&id=123547 видно в броузере, передавать переменные методом GET или POST, пользуя ajax возможности. и тд. =)
Это только одна грань задуманного).
MVC модель, что то аля фреймворка для создания сайтов, самый нижний уровень.
Я хочу предоставить набор возможностей/стандартов для ускорения выполнения задач в будущем).
Вот такие планы наполеона)

Источник



Файл .htaccess — настройка перенаправлений и управление конфигурацией веб-сервера

.htaccess — это конфигурационный файл веб-сервера Apache, позволяющий управлять работой веб-сервера и настройками сайта с помощью различных параметров (директив) без изменения основного конфигурационного файла веб-сервера.

На хостинге RU-CENTER в настоящее время используется веб-сервер Apache версии 2.4.

Директивы файла .htaccess действуют для каталога, в котором размещён такой файл, и для всех его подкаталогов. Если вы желаете с помощью .htaccess изменить настройки для сайта в целом, его следует размещать в корневом каталоге сайта

Пожалуйста, будьте внимательны при редактировании файла .htaccess! При сохранении такого файла в кодировке UTF-8 в нём не должно присутствовать BOM-сигнатуры. Для редактирования файла .htaccess и других конфигурационных файлов мы рекомендуем использовать не «Блокнот» Windows, а специальные текстовые редакторы, например Notepad++.

Читайте также:  Тест на грамотность 12 вопросов по правописанию

Примеры использования файла .htaccess

1. Перенаправление доменов c синонима сайта на основной домен с кодом 301

Перенаправить запросы на domain.ru с любого из синонимов сайта

RewriteEngine On
RewriteCond % !^domain\.ru$ [NC]
RewriteRule ^(.*)$ http://domain.ru/$1 [L,R=301]

Перенаправить запросы на www.domain.ru с любого из синонимов сайта

RewriteEngine On
RewriteCond % !^www\.domain\.ru$ [NC]
RewriteRule ^(.*)$ http://www.domain.ru/$1 [L,R=301]

Эти правила рекомендуется размещать в самом начале файла .htaccess.

2. Постоянное перенаправление с кодом 301

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

Redirect 301 /page.html http://www.domain.ru/new_page.html

  • page.html — адрес старой страницы относительно корня сайта;
  • www.domain.ru — имя сайта;
  • new_page.html — адрес страницы, на которую нужно выполнить перенаправление.

Подобное правило не сработает для перенаправления с адресов, содержащих Query String (символы после ?). Для запросов, содержащих QUERY_STRING, можно использовать сочетание RewriteCond и RewriteRule.

Например, для перенаправления всех запросов к странице /period/?test=123 вашего сайта на domain.ru, вы можете написать:

Options +FollowSymLinks
RewriteEngine On
RewriteCond % ^test=123$ [NC]
RewriteRule ^period/$ http://domain.ru/ [L,R=301]

3. Переопределение страниц ошибок

При помощи файла .htaccess вы можете установить свои страницы ошибок:

#401 Авторизация не выполнена
ErrorDocument 401 http://domain.ru/errors/401.html
#403 Доступ запрещен
ErrorDocument 403 http://domain.ru/errors/403.html
#404 Страница не найдена
ErrorDocument 404 http://domain.ru/errors/404.html
#500 Внутренняя ошибка сервера
ErrorDocument 500 http://domain.ru/errors/500.html

Соответствующие файлы страниц ошибок (401.html, 404.html и др.) необходимо разместить в каталоге

Для того чтобы при случайном упоминании прямых ссылок на такие страницы они не проиндексировались в поисковых системах, рекомендуется:

User-agent: *
Disallow: /errors

/ваш_домен/docs/errors/.htaccess, в котором прописать

4. Постраничное перенаправление запросов на другой домен c кодом 301

Следующий код перенаправит все запросы к страницам вашего сайта на аналогичные страницы другого сайта, например, запрос http://domain.ru/main будет переадресован на http://www.newdomain.ru/main:

Redirect 301 / http://www.newdomain.ru/

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

5. Ограничение доступа к сайту по IP

Запретить доступ к сайту с IP-адресов 123.4.5.6 и 123.5.4.3

Order Allow,Deny
Allow from all
Deny from 123.4.5.6 123.5.4.3

Запретить доступ к сайту со всех адресов кроме 123.4.5.6 и 123.5.4.3:

Order Deny,Allow
Deny from all
Allow from 123.4.5.6 123.5.4.3

Запретить доступ к сайту для всех:

6. Переопределение главной страницы сайта (индексного файла каталога)

Сделать главной страницей файл menu.html:

7. Включение обработки PHP в .html-файлах

RemoveHandler .html .htm
AddType application/x-httpd-php .php .htm .html .phtml

8. Запрет выдачи листинга каталога

В случае отсутствия в папке главной страницы (индексного файла), при обращении без указания конкретного имени файла в запросе будет выдан список всех файлов, находящихся в каталоге. Для того чтобы запретить отображение листинга каталога, добавьте в файл .htaccess строку:

9. Включить выполнение CGI-скриптов в папке docs для файлов с расширениями .cgi, .pl. .py

В папке c CGI-скриптами необходимо разместить файл .htaccess с содержимым:

AddHandler cgi-script .cgi .pl .py
Options +ExecCGI

Скрипт должен иметь атрибут исполнения (+x, права доступа, начинающиеся с 7, например, 755).

Атрибуты (права доступа) можно изменить с помощью файлового менеджера панели управления, при помощи вашего FTP-клиента или по SSH. Также в разделе Веб-серверУправление модулями должен быть включен модуль CGI.

10. Блокировка переходов со сторонних ресурсов

Для запрета перехода c baddomain.ru на domain.ru добавьте в .htaccess следующее:

RewriteEngine on
RewriteCond % baddomain\.ru [NC]
RewriteRule .* — [F]

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

RewriteEngine on
RewriteCond % baddomain\.ru [NC,OR]
RewriteCond % baddomain2\.ru [NC,OR]
RewriteCond % baddomain3\.ru [NC]
RewriteRule .* — [F]

11. Особенности использования кириллических доменов (.РФ, .МОСКВА и др.)

В файле .htaccess использование кириллицы не допускается. При составлении правил перенаправления для кириллических доменов необходимо указывать имя домена в punycode. Узнать имя домена в punycode можно с помощью сервиса Whois.

Например, для перенаправления site.ru на caйт.рф нужно воспользоваться следующим правилом:

RewriteEngine on
RewriteCond % ^www\.site.ru [NC]
RewriteRule ^(.*)$ http://xn--80aswg.xn--p1ai/$1 [R=301,L]

В этом случае ваши посетители могут увидеть именно punycode-представление доменного имени в адресной строке браузера. Это не является ошибкой.

12. Перенаправление с HTTP на HTTPS и обратно

Для работы перенаправления на сайте должен быть установлен действительный SSL-сертификат.

Перенаправить запросы на https://domain.ru

Перенаправить запросы на http://domain.ru

3. Диагностика ошибок

Если после редактирования или размещения .htaccess при обращении к сайту вы получили ошибку 500, то, скорее всего, в файле .htaccess допущена ошибка. Посмотреть её причины вы можете в лог-файле /var/log/ваш_домен.error_log.

Источник