Как убрать слэш в конце url

от admin

Как удалить/добавить слэш в конце 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 (уже без слеша), чтобы можно было добавлять страницы в такие исключения. Спасибо!

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

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

Читать:
Java lang illegalstateexception как исправить

Ребят, скажите, а реально сделать, чтобы 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 % (.*)/$ . Because in the root directory REQUEST_URI equals / , the leading slash, and it would be misinterpreted as a trailing slash.

Убрать слэш / в конце URL

При попытке зайти по этому URL, происходит редирект на domain.tld/script/
(обратите внимание на слэш в конце).

Погуглив немного, выяснил, что этим безобразием занимается mod_dir.
И что существует директива DirectorySlash off, которая отключает такое его поведение.

Но вот что-то она не срабатывает. Пробовал ее ставить и в VirtualHost, и в .htaccess — всё равно продолжает редиректить.

В попытках избавиться от этого эффекта попробовал изобрести подобный рерайт:
RewriteEngine on
RewriteCond % -d
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:

      1. External 301 redirect ( mydomain.com/account/ —> mydomain.com/account )
      2. 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).

      Stephen Ostermiller's user avatar

      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.

Похожие статьи