В сегодняшней заметке я расскажу как можно быстро и легко убрать расширения php, cgi, html и любые другие из URL (из ссылок в адресной строке). Иногда такая потребность возникает, например, для придания ссылкам красоты и большего удобства для посетителей сайта.
К примеру из http://example.com/pagename.php нужно сделать http://example.com/pagename
Для этого достаточно в файл .htaccess, который находится в папке Вашего сайта добавить следующие строки:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
При этом, разумеется, нужно при необходимости заменить «php» в строках 3 и 4 на нужное расширение.
После этого переход по ссылкам вида http://example.com/pagename начнёт происходить без ошибок.
Альтернативный вариант.
Наш читатель aleksey предложил ещё вот такой вариант:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^.*$ $0.php [L,QSA]
RewriteCond %{THE_REQUEST} ([^\s]*)\.php(\?[^\s]*)?
RewriteRule (.*) %1 [R=301,L]
Обратите внимание, может влиять на обработку POST-запросов отправляемых скриптам с расширением php! (спасибо S1lllver за важное уточнение)
Удалить расширение .html тоже несложно.
#example.com/page будет показывать контент из example.com/page.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+)$ $1.html [L,QSA]
#301 редирект с example.com/page.html на example.com/page
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.html\ HTTP/
RewriteRule ^(.*)\.html$ /$1 [R=301,L]
Возможные проблемы
Если Ваш хостер использует связку nginx+Apache, то при попытке вышеописанным методом удалить расширения из ссылок на картинки, html-файлы и прочую статику будет отдаваться ошибка 404.
В этом случае Вам необходимо либо самостоятельно настроить сервер таким образом, чтобы исключить нужные типы файлов из списка статических файлов либо обратиться в службу технической поддержки с той же просьбой.
Почему у вас на сайте нет фавикона? Вот как его сделать: создаём картинку в любом графическом редакторе шириной 16 пикселей и высотой 16 пикселей. Сохраняем и называем favicon.ico . Готово!
Лепить «абы что» не хочу, а вдумчиво заняться ни времени, ни энтузиазма.
Хотя Вы правы — без фавикона немного неудобно плюс в поисковой выдаче не очень видно.
Займусь.
Огромное спасибо
Очень выручила информация об альтернативном варианте удаления расширения файлов php!!! Огромное вам и Алексею спасибо!!! Всего наилучшего!
Были рады вам помочь!
Возможно тупой вопрос, а поисковики как смотрят на это?
Для них адрес с .php и без, это не разные страницы?
Или это только в адресной строке браузеров что-то меняет.
Заранее благодарю
Формально адреса
сайт.ру/страница.пхп
сайт.ру/страница
это два разных адреса и если на них дублируется информация — это не совсем гуд с точки зрения поисковиков. То есть, адрес меняется и для поисковиков, и в адресной строке.
При выдаче кода 308 поисковик заменит ссылку с типом на без, только нужно чтобы роботы могли туда зайти.
Альтернативный вариант не работает нормально , когда я его вставил в код своего сайта , изза него $_POST методы не отправлялись , используйте 1ый вариант.
Да, такое вполне может быть, если форма отправляет данные на чего-то-там.php.
Спасибо за замечание, добавил в заметку!
Спасибо очень помогло
Огромное спасибо
Можно ли как-то убрать расширение файла в конце адреса без использования php ? Читал, что можно убрать .html с помощью файла .htaccess, но весь код, который я видел для убирания .html написан на php .
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html
Должно сработать (разумеется, если html не обрабатывается нжинксом как статический файл)
Первый способ у меня вообще не работает, а со вторым я не знаю, что делать… Просто получается, что все хорошо обрабатывается, но у меня есть файл kotly.html и папка kotly с другими страницами и так получается, что этот файл не включается, т.к. он просто в поиске показывает папку
Ну так все правильно. Чтобы исправить — нужно или файл, или папку переименовать так, чтобы их имена не совпадали. Другого варианта нет.
Здравствуйте, первый вариант к сожалению не помог вырезать php
ЧПУ я делал вот так, может в этом проблема:
RewriteEngine On
Options +FollowSymlinks
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://site.ru/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$ http://%1/$1 [L,R=301]
RewriteRule ^index.php$ / [QSA,R]
RewriteRule ^price-elektrik$ price-elektrik.php [QSA,L]
Заранее спасибо, если уделите минуту Вашего времени