Как удалить/добавить слэш в конце URL через .htaccess
Наверняка, многие из Вас понимают, что в большинстве случаев «http://mysite.ru/dir» и «http://mysite.ru/dir/» откроют одно и то же. Но это лишь в большинстве случаев, а не всегда. Если идёт обработка REQUEST_URI через PHP, то там может иметь огромное значение наличие или отсутствия слэша в конце URL. И очень важно привести весь сайт к единому стандарту, чтобы было либо со слэшем на конце, либо без. Вот как удалить слэш на конце URL через .htaccess, а также как его добавить, я расскажу в этой статье.
Я приведу 2 кода, один всегда удаляет слэш на конце URL, а другой всегда добавляет. Начнём с 1-го варианта:
RewriteEngine On
RewriteBase /
RewriteCond %
RewriteCond %
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 %
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 %
Добрый день. Была такая проблема, слеш на конце ссылок. Все сделал как вы написали..все работает. Но перестало заходить в админку. Joomla. там видимо на конце тоже слеш. Как быть в таком случае?
Как быть в таком случае? Не использовать CMS.
"На этой странице обнаружена циклическая переадресация" круто работает — не работает!
Скажите, а как мне добавить слеш в конце для opencart, данный код не работает
Здравствуйте. Подскажите пожалуйста в следующей ситуации: Есть вёрстка html5+CSS Первоначально была задача, избавиться через .htaccess от расширения php на конце URL Для этого прописал в .htaccess следующее: RewriteEngine On RewriteCond %
Здравствуйте! Подскажите, пожалуйста, как сделать исключения для страниц с Get параметрами: т.е., везде на сайте со слешем в конце url, а на страницах с Get параметрами — без. Например: www.site.ru/catalog/ и www.site.ru/login (уже без слеша), чтобы можно было добавлять страницы в такие исключения. Спасибо!
Добрый день. Подскажите, что может быть не так — использовал ваши рекомендации по удалению слеша. Результат такой: www.site.ru/catalog, а вот для главной такой — www.site.ru/ Не убирается слеш индексной страницы.
Тя кто моды учил писать!? Не парь людям мозги, чтоб они потом сайты не лопатили, искали ошибку. НАРОД, КТО JOOMLA ИСПОЛЬЗУЕТ . Не вздумайте вставить эту ахинею, если у вас регистрация присутствует. RewriteCond %
Ребят, скажите, а реально сделать, чтобы http://site.ru/contacts.php открывался как http://site.ru/contacts/ Т.е ссылка то выглядит как ссылка на директорию contacts, но это файл. Или по старинке в папку contacts поместить index.php?
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Htaccess: add/remove trailing slash from URL
My Problem -> I have been trying to force remove or add trailing slash to the end of my URL to prevent duplicated content and also to clean up my URLs.
I have tried all sorts and tried everything I could think of and loads from the interwebs but no such luck yet! It might be a quick fix but I have looked at it so much I am probably blind to something dead obvious.
So I present you with all my .htaccess code:
4 Answers 4
Right below the RewriteEngine On line, add:
to enforce a no-trailing-slash policy.
To enforce a trailing-slash policy:
EDIT: commented the R=301 parts because, as explained in a comment:
Be careful with that R=301 ! Having it there makes many browsers cache the .htaccess-file indefinitely: It somehow becomes irreversible if you can’t clear the browser-cache on all machines that opened it. When testing, better go with simple R or R=302
After you’ve completed your tests, you can use R=301 .
To complement Jon Lin’s answer, here is a no-trailing-slash technique that also works if the website is located in a directory (like example.org/blog/):
For the sake of completeness, here is an alternative emphasizing that REQUEST_URI starts with a slash (at least in .htaccess files):
Just don’t use %
Убрать слэш / в конце URL
При попытке зайти по этому URL, происходит редирект на domain.tld/script/
(обратите внимание на слэш в конце).
Погуглив немного, выяснил, что этим безобразием занимается mod_dir.
И что существует директива DirectorySlash off, которая отключает такое его поведение.
Но вот что-то она не срабатывает. Пробовал ее ставить и в VirtualHost, и в .htaccess — всё равно продолжает редиректить.
В попытках избавиться от этого эффекта попробовал изобрести подобный рерайт:
RewriteEngine on
RewriteCond %
RewriteRule ^(.+)/$ domain.tld/$1 [L]
Но он не дает никакого эффекта. Вернее вызывает зацикливание рерайта.
Подозреваю что я натолкнулся на какой-то bug Апача, либо конкретно модуля mod_dir.
И всё же… что делать?
How to remove trailing slashes from URL with .htaccess?
Across the entire domain, we’d like the URLs to hide file extensions and remove trailing slashes, independent of the domain name itself (as in, works on any domain).
Sample of our directory structure
We’re not using index.* files except for the homepage.
- /
- /index.php
- /account.php
- /account
- /subscriptions.php
- /reset-password.php
The goal
Some examples of how these files might be requested, and how they should look in the browser:
/ and index.php —> mydomain.com (literally just the bare domain name).
/account.php or /account/ or /account —> mydomain.com/account
/account/subscriptions.php or /account/subscriptions/ or /account/subscriptions —> mydomain.com/account/subscriptions
As you can see, there are several ways to access each webpage, but no matter which of the 2 or 3 ways you use to get there, it only shows the one preferred URL in the browser.
The question
How is this done with .htaccess using mod_rewrite?
I’ve banged my head against the wall trying to figure this out, but in general, the rewrite flow would seem to be something like this:
- External 301 redirect ( mydomain.com/account/ —> mydomain.com/account )
- Internally append .php ( mydomain.com/account —> mydomain.com/account.php )
I’ve been Googling this all day, read thousands of lines of documentation and config texts, and have tried several dozen times. I think more brains on this would help a lot.
UPDATE
We found an answer our question (see below).

3 Answers 3
Thanks for your time to look at the question, but we appeared to have figured it out:
We have to turn off Multiviews and Indexes so the engine doesn’t get confused and instead try to reference any index.* file or show a directory listing (also confusingly called an «index» with Apache. ) when a directory appears to be requested.
The first redirect visibly ( R=301 ) removes the trailing slash, and the second one internally rewrites it to the PHP (or HTML, etc.) file at hand.
This .htaccess file also supports query strings.
Update As noted in the comments below much earlier, we’ve switched to nginx, and this is all our conf file contains related to URL-rewriting (from my dev box):
We’ve also switched from PHP to just plain HTML, but changing the extensions above should hardly make a difference, if at all.