Самописный сайт и ЧПУ

12 3
mff
На сайте с 21.02.2008
Offline
266
mff
3151

Друзья! Помогите пожалуйста добить ЧПУ на самописном сайте.

У меня 3 категории на сайте, это "Страны", "Жанры", "Страны и Жанры". Мне нужны ссылки вида:

https://wc.ru главная

https://wc.ru/animals/ жанр, обработчик genre.php
https://wc.ru/austria/ страна, обработчик country.php
https://wc.ru/austria/animals/ страна и жанр, обработчик country_genre.php
https://wc.ru/austria/animals/national_zapovednik.html страница со статьей , обработчик webcam.php

Пока получилось только сделать страны и страницы со статьей. Но вот уже заметил что файлы .svg стали отображаться как страница. И как быть с категорией "жанры" и "страны и жанры"? Прописал в .htaccess:

RewriteEngine On

RewriteRule ^(.*)/$ country.php?co=$1 [L]
RewriteRule ^(.*)/(.*)$ webcam.php?ge=$1&wc=$2 [L]

Не могу найти нормальную статью по работе с ЧПУ. Помогите пожалуйста. С ув.

T7
На сайте с 19.09.2018
Offline
63
#1
mff:
Друзья! Помогите пожалуйста добить ЧПУ на самописном сайте.
Пока получилось только сделать страны и страницы со статьей. Но вот уже заметил что файлы .svg стали отображаться как страница. И как быть с категорией "жанры" и "страны и жанры"?

По мне так оптимально - единая точка входа index.php и там обработать $_SERVER['REQUEST_URI']

Например завести правила для 1 сегмента урла

 

...
"rules" : {
"usr" : {
"class" : "usr",
"template" : "land.twig",
"robots" : "noindex",
"usr":"all",
"content_type":"text/html"
},
"adm_xhr" : {
"class" : "adm",
"template" : "",
"robots" : "noindex",
"usr":"admin",
"content_type":"application/json"
},
}
...

и в зависимости 1 сегмента от правил выполнить соотв. действие

mff:
Друзья! Но вот уже заметил что файлы .svg стали отображаться как страница.

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
#Отдавать index.php только если не файл/папка/ссылка
RewriteCond %{REQUEST_URI} !\.(png|css|js|jpg|gif|svg)$
#Не выполнять правило для урлов с такими расширениями, даже если они не -f,-d,-l
RewriteRule ^(.+)$ /index.php [QSA]
Евгений Крупченко
На сайте с 27.09.2003
Offline
178
#2

[off]

простите, но вы все делаете не правильно :-\

если уж делать самопис, то с осознанием как все должно быть в идеале.

а в идеале nginx должен готовую статику раздавать моментально. и никаких php и уж тем более .htaccess не должно фигурировать между запросом и отдачей ответа.

с .htaccess ковыряются когда руки связаны какой-то жизненно необходимой cms, переделывать которую нет времени/возможности

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

и когда надо обновить - перезапускаете регенерацию. лучше конечно не всего, а лишь части изменившейся.

[/off]

S
На сайте с 30.09.2016
Offline
469
#3

mff, апач не умеет отличать страны от жанров - ему всё равно, что это, austria или animals.

Поэтому у Вас 2 варианта на выбор:

1. Делать адресацию вида

https://wc.ru/genre/animals/

https://wc.ru/country/austria/

2.Направлять запросы на index.php и там разруливать их.

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
LEOnidUKG
На сайте с 25.11.2006
Offline
1722
#4

На данный момент развития интернета, лучше всё разруливать в index.php

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

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
mff
На сайте с 21.02.2008
Offline
266
mff
#5

timo-71, большое вам спасибо! Прописал в htaccess ваши коды, но посему то всеравно показывает svg как страницу: http://mj2.ru/img/views.svg

EvGenius, я извиняюсь но зачем мне движок для простенького каталога веб-камер состоящего из 4 страниц и нескольких табличек в базе данных? И вообще я не любитель использовать готовые движки, модули. В них 90% не нужного и только 10% нужного. Перепиливай их потом и забудь про обновления... Максимум могу плеер какой нибудь использовать готовый.

EvGenius:
делайте допустим вот все тоже самое, но чтоб скрипт этот сохранял результат отдельными файлами.
и когда надо обновить - перезапускаете регенерацию. лучше конечно не всего, а лишь части изменившейся.

Спасибо, но ни чего не понял :( Какой скрипт? Какой результат? Мне бы пример/кусок кода...

Sitealert:
1. Делать адресацию вида
https://wc.ru/genre/animals/
https://wc.ru/country/austria/

Этот вариант ни как не подходит. Много лишнего.

Sitealert:
2.Направлять запросы на index.php и там разруливать их.

Не могли бы посоветовать какую нибудь статью по этой тематике, написанную доступным языком?

С ув.

M
На сайте с 04.12.2013
Offline
223
#6
mff:
Этот вариант ни как не подходит. Много лишнего.

Это самый вменяемый вариант из простых: есть имя коллекции/признака, есть имя элемента/значение признака.

Не могли бы посоветовать какую нибудь статью по этой тематике, написанную доступным языком?

Посмотрите мою статью Как сделать единую точку входа с ЧПУ? – как раз для начинающих.

---------- Добавлено 16.02.2019 в 19:15 ----------

Этот вариант ни как не подходит. Много лишнего.
Может вы просто не до конца поняли суть. Вас никто не заставляет добавлять к показанным адресам еще и слаг статьи. Это уже будет др. ветвь/ветви. Но в принципе можете глянуть на G-Drive. В нем можно прятать имя признака/обработчика за первым компонентом пути. Ваши два уровня поддерживаются непосредственно ядром. Правда, по-моему не оч. красиво дублирование компонентов в идентификаторах animals и animals/national_zapovednik.html. И, уже начиная со второго уровня, нужно дописывать разруливание в пределах осн. обработчика.

---------- Добавлено 16.02.2019 в 19:23 ----------

У меня 3 категории на сайте, это "Страны", "Жанры", "Страны и Жанры".
По-моему это два независимых признака. Гляньте демку в конце статьи Как сделать фильтрацию элементов по двум независимым признакам? Хотя это все условность. Можно наплодить и отдельные сущности "Страны и Жанры". Тогда у статей будет только одно связующее поле с категориями.
Домены и скрипт для коротких ссылок: https://u75.ru/domains-for-shortcuts
E
На сайте с 23.03.2017
Offline
35
#7
mff:
И вообще я не любитель использовать готовые движки, модули. В них 90% не нужного и только 10% нужного. Перепиливай их потом и забудь про обновления

Ну перепиливай давай тогда свою самописку и то же про обновления забудь.

Новости электроники (https://trustoff.ru)
mff
На сайте с 21.02.2008
Offline
266
mff
#8
miketomlin:
Посмотрите мою статью Как сделать единую точку входа с ЧПУ? – как раз для начинающих.

Коллега, большое спасибо за статейку. Немножко разобрался.

В общем я так понял, нужно делать в индексном файле единый обработчик и, как правильно сказать, роутер, то есть подгружать нужный файл php исходя из данных, полученных в URI? За одно там же проверить, есть ли такие данные в базе и если нету, выдавать ответ отличный от 200, то есть направлять на страницу 404? 🙄

С ув.

D
На сайте с 30.09.2018
Offline
31
#9

Зачем городить велосипеды? Давно уже написаны хорошие классы роутеров. С полноценным функционалом.

К примеру это https://github.com/bramus/router

По поводу статики выше правильно сказали, что лучше отдавать nginx. Связка апач и нжинкс показывает прекрасную скорость.

Если интересно, могу скинуть готовые конфиги для небольших проектов.

Сайт под ключ (https://devmastery.ru)
M
На сайте с 04.12.2013
Offline
223
#10
mff:
В общем я так понял, нужно делать в индексном файле единый обработчик и, как правильно сказать, роутер, то есть подгружать нужный файл php исходя из данных, полученных в URI?

Единый обработчик – это фронт-контроллер. Роутер – обычно лишь его часть. Например, во фронте можно выполнять общие для всего сайта конфигурирование, авторизацию и т.п. Или выполнять какую-то общую финальную обработку после возврата из частного обработчика (работа роутера обычно заканчивается вызовом частного обработчика). Подгружать один файл – это слишком упрощенное представление. Обычно при формировании страниц/подготовке др. ответа участвует много файлов. Например, даже в простейшем движке по ссылке выше для сборки страницы помимо частного обработчика (который кстати может быть пропущен, т.к. фронт типичные действия по выборке данных из БД выполняет сам) обычно подключаются файлы частного и общего шаблонов – это как раз пример финальной обработки вне частного обработчика. Прочитать об этом более подробно, а также посмотреть на примеры частного и общего шаблонов можно тут.

За одно там же проверить, есть ли такие данные в базе и если нету, выдавать ответ отличный от 200, то есть направлять на страницу 404?

Именно так. Это одна из задач роутера – инициировать выдачу 404-ой (необязательно выдавать самому) при «непопадании» адреса запроса под заранее заложенные правила. Например, движок по ссылке выше проверяет «попадание» под единственную заложенную маску для соответствия адреса общему предопределенному формату и отсеивания недопустимых символов в нем. А ведь можно выполнять такую проверку в цикле, обходя «роуты» в порядке приоритета и проверяя попадание под их маски.

12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий