Php скрыть адресная строка

Как сделать ссылку без расширения php?

Всем Доброго времени суток и с Наступающим Новым Годом!

Как сделать путь без указания расширения? Например есть путь:

Сайт самописный, на локальном сервере.

RewriteCond % !-f RewriteRule ^([^.]+)$ $1.php [NC,L]

Но в этом случае на всех старницах сайта нужно удалять расширение файлов php. Да и сам документ nav.php который подключаю ко всем страницам через include , я так понимаю нужно будет переименовывать?

2 способ работает, но я сомневаюсь в адекватности кода

RewriteEngine On RewriteCond % !-f RewriteCond % !-d RewriteCond %.php -f RewriteRule ^.*$ $0.php [L,QSA] RewriteCond % ([^\s]*)\.php(\?[^\s]*)? RewriteRule (.*) %1 [R=301,L] RewriteEngine On RewriteRule ^index.php$ / [QSA,R]

Есть кто шарит в этом и может помочь, какой вариант лучше или вообще как это реализвать правильно?)

Комментарии: 11

Александр, приветствую! Спасибо! Но как то странно это решение работает… Одни старницы норм открывает без расширения, а другие страницы в этой же папке выдает ошибку… Хотя страницы считай идентичны…

Запрашиваемый ресурс не найден. Ссылка на странице неверна или устарела. Пожалуйста, сообщите автору этой страницы об ошибке.

Если Вы считаете, что это ошибка сервера, пожалуйста, сообщите об этом веб-мастеру.
Error 404
share
Apache

Пожалуйста! Точное решение сложновато подсказать, т.к. оно будет зависеть от того, как вы организовали этот самописный сайт, а также от среды, в которой он будет работать.
Если вам подходит решение №2, то используйте его.

В движках (CMS) это обычно выполняется в php коде, а не в «.htaccess». Т.к. в php можно написать любую очень гибкую логику, чем в «.htaccess».
Для этого в «.htaccess» добавляется следующая конструкция, которая в данном случае будет перенаправлять все запросы в «index.php» (точку входа):

RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

и не нужен RewriteEngine On?

Либо добавить этот фрагмент к уже добавленному коду?

RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?q=$1 [L,QSA] # Rewrite /foo/bar to /foo/bar.php RewriteRule ^([^.?]+)$ %{REQUEST_URI}.php [L] # Return 404 if original request is /foo/bar.php RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$" RewriteRule .* - [L,R=404] # NOTE! FOR APACHE ON WINDOWS: Add [NC] to RewriteCond like this: # RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$" [NC]

Все равно попробывал 2 варианта, добави все «.htaccess» на обих ссылка в адресной строке меняется, но почему то всегда отображается только index.php…
Сайт самый обычный без каких либо внешних подключений, использоваться будет просто загрузкой на хостинг например «beget и тд». Пути к файлам самые обычные через например: /img/img_1.png
единственное подключние есть через php include когда ко все файлам подключаю nav.php.

P.S. Прощу прощения за такой детальный распрос, но недопонял этот момент.

RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Я его написал для примера, как это реализовано в CMS. Если это сделаете, то тогда роутинг вам нужно будет реализовывать в PHP.

Если у вас там всё просто, то этот вариант должен работать:

RewriteEngine on RewriteRule ^([^.?]+)$ %{REQUEST_URI}.php [L] RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$" RewriteRule .* - [L,R=404] # RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$" [NC]

В Windows для Apache раскомментируйте последнюю строчку. Но, если разрабатываете, то лучше в среде более близкой к тому, что у вас будет на хостинге.

Попробуйте добавить ещё в начало вашего «.htaccess»:

Понятно! Как вы и сказали попробовал этот вариант и с этой строчкой «Options -MultiViews» и без.
Но история почему то повторяется Одни старницы норм открывает без расширения, а другие страницы в этой же папке выдает ошибку… Хотя страницы считай идентичны…

Ладно бог с ним! Как вы и сказали буду использовать 2 свой вариант. Просто в этом коде я вообще ни строчки не понимаю, поэтому и хотел уточнить, нет ли там каких либо скрытых запросов или ненужных действий которые приведут к лишней загрузке или попадалову. )

RewriteEngine On 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] RewriteEngine On RewriteRule ^index.php$ / [QSA,R]

P.S. А вообще интересно обязательно ли скрывать расширение или нет? Или все это делается для красоты?

Александр, приветствую! Я догадываюсь уже замучил вас))) Да что там говорить и себя замучил уже!)
Все таки и мой 2 вариант не подходит поскольку ссылки начинают дублироваться открываясь 2 адресам:
Например www.site.ru/book/key_1.php и www.site.ru/book/key_1. Начал пробовать все подрят, как сделать так чтобы переходило только по 1 адресу www.site.ru/book/key_1. В итоге вернулся в вашему же коду который вы мне подсказали ниже, поэтому могли бы вы мне подсказать пару моментов?

RewriteEngine on RewriteRule ^([^.?]+)$ %{REQUEST_URI}.php [L] RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$" RewriteRule .* - [L,R=404] # RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$" [NC]

1 Вопрос -> Насколько я понимаю прописывая этот код нужно все ссылки в коде поменять и убрать php (c /book/key_1.php на /book/key_1)? По крайне мере у меня так сработало. И потом когда я переду по другому адресу с расширением php (/book/key_1.php) выдаст 404 not found. Что в принципе и правильно насколько я понимаю? Я этого вообще например не знал, так ли это?
Непонятно как быть с подключаемыми файломи:
У них что тоже расширение убирать? Тогда они перестают запускаться…

2 Вопрос -> Как изменить этот код, чтобы когда указывается неправильный путь открывалась не серверная страница 404 not found а своя? Как прописать ErrorDocument /404.php чтобы это все не ломалось?

3 Вопрос -> Как опять же изменить этот код чтобы адрес был без index т.е есть логотип на сайте нажимая на который, ты переходишь на главную страницу, так вот, я изначально писал путь: /index.php, но щас начал просто указывать «/» (в чем сомневаюсь нужно ли так делать?) И в этом случае действительно с адресной строки убираетсяindex а код выше убирает php. Но все равно если я указываю www.site.ru/index он открывается, а нужно только чтобы переходило по 1 адресу www.site.ru.

Благодрю если осилили этот текст до конца, и за помощь! 😉

# включаем механизм mod_rewrite RewriteEngine On # задаём 3 дополнительных условия для правила RewriteRule, находящего сразу после этих директив: ### 1. если запрос не является файлом RewriteCond %{REQUEST_FILENAME} !-f ### 2. если запрос не является файлом RewriteCond %{REQUEST_FILENAME} !-d ### 3. если запрос при добавлении к нему .php является файлом RewriteCond %{REQUEST_FILENAME}.php -f # если все 3 дополнительных условия выполнены и строка соответствует регулярному выражению (^.*$), то преобразовываем строку в новую посредством добавления к ней .php и отменяем следующие проверки (флаг L) RewriteRule ^.*$ $0.php [L,QSA] RewriteCond %{THE_REQUEST} ([^\s]*)\.php(\?[^\s]*)? RewriteRule (.*) %1 [R=301,L] RewriteEngine On RewriteRule ^index.php$ / [QSA,R]

К остальным строчкам, чтобы было понятно, тоже необходимо добавить комментарии. После этого будет полная картина того, что этот код делает.

Скрывать расширение страницы — это хорошая практика, т.к. не будет лишней информации в URL. Да, и URL от этого будет выглядеть более красиво.

Привет!
Да, доступ к конкретной странице должен всегда осуществляться по одному адресу. С точки зрения поисковой оптимизации очень плохо, если один и тот же контент будет доступен по разным URL.
Т.е., например, страницу «/book/key_1» необходимо открывать только так и никак иначе:

1. Ссылки в HTML-коде, который вы будете передавать на клиент должны быть на эту страницу только в таком виде:

Обратиться к ней через «/book/key_1.php» конечно нужно запретить. У вас должна выдаваться в этом случае «ошибка 404» (такой страницы не существует). Иначе для SEO это будет очень плохо, т.к. одинаковый контент у вас будет присутствовать по разным URL.
В PHP коде ничего убирать не надо, в данном случае эти правила (в «.htaccess») здесь не причём. Вы просто включаете этот файл «nav.php» в текущий файл:

3. Один контент должен всегда находиться по одному URL. Это же касается и главной страницы. Она должна быть доступна только по «/». В случае, если мы указываем «www.site.ru/index» мы должны сделать редирект на главную или 404 (тут уже на своё усмотрение).

Александр, Огромное Спасибо Вам за полезную информацию, и что вы всегда на связи и помогаете! Теперь хоть есть примерное понимание куда копать.
Вроде получилось все сделать и даже «о чудо, он работает», но все равно можете взглянуть на адекватность кода и подправить в паре моментов?
Вот первоначальный код, он грубо говоря удаляет отсекает все что оканчивается на php.

RewriteEngine on RewriteRule ^([^.?]+)$ %{REQUEST_URI}.php [L] RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$" RewriteRule .* - [L,R=404] # RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$" [NC]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\ HTTP/ RewriteRule .* - [L,R=404]
ErrorDocument 404 /err404.php RewriteEngine on RewriteRule ^([^.?]+)$ %{REQUEST_URI}.php [L] RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$" RewriteRule .* - [L,R=404] # RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$" [NC] RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\ HTTP/ RewriteRule .* - [L,R=404]

Источник

Убираем .html, .php и .htm в конце URL-адресов на Apache/Nginx

Часто слышу, что сеошники советуют убирать окончания .html, .php и .htm в адресах ваших сайтов – якобы, это негативно влияет на продвижение. Кто-то же говорит, что это просто визуально добавляет адресу лишний мусор.

В любом случае, убирать или оставлять эти окончания, решать вам, я же покажу, как это реализовать на статичном сайте (то есть сайте, находящемся не на CMS). Почему только на статичном? Потому что для различных CMS это реализовывается разными методами, о которых я также расскажу в последующих статьях.

Не утверждаю на 100%, что этот метод не будет работать на какой-то из CMS – пробуйте и о результатах отписывайтесь в комментариях.

Убираем .html, .php и .htm на Apache

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

1. Подключитесь к сайту по FTP и в корне сайта найдите файл .htaccess. Откройте его. Если такой файл отсутствует – создайте.

2. Найдите строчку, содержащую:

Сразу после нее вставьте следующие правила.

Если вам необходимо убрать .php:

 RewriteCond %{REQUEST_FILENAME> !-f RewriteRule ^([^.]+)$ $1.php [NC,L]

Если вам необходимо убрать .html:

 RewriteCond %{REQUEST_FILENAME> !-f RewriteRule ^([^.]+)$ $1.html [NC,L]

Если вам необходимо убрать .htm:

 RewriteCond %{REQUEST_FILENAME> !-f RewriteRule ^([^.]+)$ $1.htm [NC,L]

Если строчка «RewriteEngine On» отсутствует в файле – добавьте ее в самое начало.

После чего сохраните изменения и отправьте файл обратно на сайт. Если раньше адреса на вашем сайте были вида

 https://www.pandoge.com/page.php

то теперь вы можете открыть эту страницу по адресу:

Убираем .html, .php и .htm на Nginx

1. Для того чтобы подобную настройку произвести в Nginx, откройте файл конфигурации по адресу:

в FTP (если вам позволяют права) либо через панель управления сервером.

2. Далее, в секцию location / , вставляем необходимые правила.

Если вам необходимо убрать .php:

Если вам необходимо убрать .html:

Если вам необходимо убрать .htm:

Если в процессе настройки у вас что-то не получается – пишите об этом в комментариях.

Установка бесплатного сертификата от Let’s Encrypt на сайт с сервером CentOS 6 + ISPmanager 4 + Nginx + Apache

Источник

Читайте также:  Ооо питон констракшн номер телефона
Оцените статью