Настраиваю ссылки хочу привести к такому виду
site/язык/get/
сейчас прописано такКод (Text):
RewriteRule ^rus/(.*)/$ /search.php?lang=rus&q=$1Проблема в том что для каждого языка нужно создавать по две записи одна та что выше и вторая если get параметра нет
Код (Text):
RewriteRule ^rus/$ /search.php?lang=rusдля 20 языков уже создаётся 40 записей а если добавить ещё один get то уже 60
Можно ли как то это упростить???Второй вопрос
На странице есть форма. При отправке данных с формы получаю ссылку вида
/rus/?q=апапап
а нужно
/rus/апапапапа/
изучи единую точку, роутинг. Станет легче и понятнее. Сейчас кашу мутишь в каше — велосипед WTF
Зачем создавать две записи если можно в search.php проверять существование параметра и его значение. По второму вопросу: можно вообще поменять метод в форме и запрос не будет виден.
Ок начал разбираться
PHP:
//Получаем доступные языки из папки lang foreach ($get_lang_mas as $get_lang) { $leng_mas[] = $leng; } } //сравниваем доступные языки с запрашиваемыми foreach ($leng_mas as $odin) { if($segments[0]==$odin[0]) echo ‘язык определили’; }после чего у меня будет первая часть ссылки правильно думаю ?
site/rus/
добавил вот такPHP:Всё заканчивается бесконечным редиректом
Какой ссылки? В смысле входящего адреса? Когда парсят путь из входящего адреса explode’ом, то первая часть – это, естественно, rus (если site – это имя хоста). У вашего парсинга есть огрехи. Непробиваемый вариант показан в этой статье: Как сделать единую точку входа с ЧПУ?
И нафига цикл для проверки попадания в созданный белый список? Здесь даже ф-ция поиска в массиве – это логическая ошибка. Сделайте rus и т.п. ключами массива – можно будет использовать бинарный поиск, т.е. просто проверять наличие этого ключа.
— Добавлено —Нафига Location? Вы про это вообще ничего не писали. Или думаете, что Location нужен для реализации роутинга?
— Добавлено —
Фишку из кода моей статьи с добавлением пустого второго компонента пути можно использовать и вам. Ее смысл в том, что потом не нужно проверять наличие этого параметра, как имени переменной. После этого можно искать просто по значению. Т.е. «тупо» искать и не найти пустой ключ. Или искать и найти
Если q – это типа параметр из формы, то меняем метод на POST и в POST-обработчике делаем редирект методом GET (можно и Get-Redirect-Get, но это реально тупо). Иначе просто action=»/rus/апапапапа/» Хотя все равно должен быть Post-Redirect-Get.
Я чёт понять не могу………Получил я два нужных мне параметра /язык/запрос/ что мне с ними дальше делать? Как отдать браузеру ?
Например был некорректный запрос site.ru/язык/запрос/fgfdgdg/gdfgdfgdg/ я хочу взять нужные 2 параметра и обработать затем сказать браузеру что site.ru/язык/запрос/fgfdgdg/gdfgdfgdg/ не существует и отдать браузеру site.ru/язык/запрос/
Вот сейчас у меня идёт бесконечный редирект
Вы пытаетесь создать то, что сами не знаете как должно работать. Возьмите любую CMS и вникайте как она устроена. В результате вы должны понимать буквально весь путь от htaccess и index.php до вызовов методов контроллера. Разобрались? Время разочарований: берите другую CMS и снова разбираете, сравнивая с предыдущей.
Вот тогда у вас сложится картинка и советы коллег станут приобретать смысл.
дак я и пытаюсь разобраться. Вот так придумал
PHP:
//Если пришло больше параметров чем нужно значит ошибка перенаправим на адекватную страницу } //Получаем доступные языки из папки lang foreach ($get_lang_mas as $get_lang) { //Сравниваем доступные языки с запрашиваемым если совпадает выходим из перебора if ($segments[0]==$leng[0]) { break; } else { //Запрашиваемый язык не нашли возвращаем русский по умолчанию $leng[0] = ‘rus’; } } echo $leng[0];
Вот так ещё дописал
PHP:
//Если пришло больше параметров чем нужно значит ошибка } //Нет запроса по этому придумаем его $input = array(«Человек», «Марс», «Батистута», «Барабан», «Tank», «Баргузин», «Матрица», «Павел Мурашко»); header(‘Location: localhost/’.$segments[0].«https://php.ru/».$input[$rand_keys[0]].«https://php.ru/», true, 301); } //Нет языка редиректим на русский по умолчанию } //Получаем доступные языки из папки lang foreach ($get_lang_mas as $get_lang) { //Сравниваем доступные языки с запрашиваемым если совпадает выходим из перебора if ($segments[0]==$leng[0]) { break; } else { //Запрашиваемый язык не нашли верём русский по умолчанию $leng[0] = ‘rus’; } } echo $leng[0];
ещё немного переделал
PHP:таким образом получается структура сайта
site.ru/rus/
site.ru/rus/проверка/
Ещё раз переписал )))
PHP:
//Если пришло больше параметров чем нужно значит ошибка } //Нет запроса грузим main.php include(‘main.php’); } //Нет языка редиректим на русский по умолчанию } //если мы дошли сюда то значит всё в порядке и загрузим страницу search $_SESSION[‘lang’] = $segments[0]; $_SESSION[‘get’] = $segments[1]; include(‘search.php’);
Вы это у нас спрашиваете?
Попробуйте echo Можно и дальше пойти, т.к. сами параметры из адреса обычно не нужно выводить (по ним др. данные выбирают):
PHP:
<h1><?= $page[‘name’] ?></h1> <?= $page[‘content’] ?>Код (Text):
INSERT INTO `site_categories` (`id`, `name`, `bits`, `module`) VALUES (‘rus’, ‘Язык: русский’, 19, ‘page’); CREATE TABLE `site_rus` ( `id` varchar(26) NOT NULL, `name` tinytext NOT NULL, `content` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `site_rus` (`id`, `name`, `content`) VALUES (», ‘Главная’, ‘<p>Главная</p>’), (‘get’, ‘Внутряк’, ‘<p>Внутряк</p>’);В итоге:
g09.ru/rus
g09.ru/rus/get
— Добавлено —Лучше отдать 404-ую без редиректа. Корректировку редиректом обычно делают для опечаток в адресе или для ранее существовавших страниц, траф на которые уместно направить на что-то другое.
— Добавлено —
Но если сильно хоЦА, пишите соотв. логику.
Например, я могу перевести используемый фронт-контроллер в режим «ручного анализа второго параметра» и добавить такой контроллер:
PHP:У меня $p0 == ‘rus’ && $p1 == ‘запрос‘ (или ‘запрос/fgfdgdg/gdfgdfgdg‘). В реале вместо $p0 лучше использовать спец. переменную, значение которой выбрано из БД, а не получено из адреса.
Я вот про это…..
Это похоже на единую точку входа или я всё же что ещё не совсем понимаю
Понятно что с переменными можно дальше уже работать запросы в базу или ещё чего
@AnteFil, Ты OpenServer используешь ?
Помогите распознать слеш
PHP:При таком подходе я не могу проверить есть ли слеш на конце так как создавая массив слешы удаляются и сайт доступен как по site/rus так и site/rus/
Парни, парни, парни ещё раз переписал у кого будут замечания напишите пожалуйста
PHP:
// Проверка полного УРЛ // Удаляем всё ненужное из УРЛ // Проверим чем заканчивается УРЛ слеш там или нет if($slesh!==«https://php.ru/»){ header(‘Location: ‘.$_SERVER[‘REQUEST_URI’].«https://php.ru/»);// На конце не слеш редиректим со слешем } //Переходим к обработке принимаемых данных создадим массив // Обрежем километровые запросы они нам не к чему //Проверяем на наличие языка если его нет редиректим на язык по умолчанию } else { //Язык есть и УРЛ меня устраивает поэтому с ним больше делать нечего и покажем то за чем пришли страницу include(‘main.php’); }
Все плохо Начиная с первой строчки. Расписывать уже в лом, т.к. обратной реакции ноль.
— Добавлено —
Вместо того чтобы думать об «Обрежем километровые запросы они нам не к чему», лучше бы вспомнили, что в REQUEST_URI может быть не только путь, поэтому лепить к этому трэйлинг слеш – затея так себе Про доп. логику, не относящуюся к делу, когда уже намечен редирект, промолчу
— Добавлено —
P.S. Фронт может обрабатывать запросы как бы к файлам, поэтому бездумно лепить трэйлинг слеш – не самое удачное решение. Значительно лучше наоборот убирать. Но потребность в нем все же может быть, поэтому этот фильтр нужно или вообще выносить из фронта на уровень конфига сервера, или наоборот глубоко закапывать.
+1