Привет всем, я создаю сайт в процедурном стиле и хочу сделать точка входа с чпу но как то не получается вроде все сделаю правильно но не получается PHP: AddDefaultCharset utf-8 ErrorDocument 404 view/404 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule (.*) index.php?$1 [L,QSA] RewriteRule ^/blog/([a-z]+)/$ blog?post=$1 [L] а вот и index.php PHP: $base = '/strides.website/'; $permit = [ 'studio' => 'view/studio.php', 'about' => 'view/about.php', 'portfolio' => 'view/portfolio.php', 'blog' => 'view/blog.php', 'training' => 'view/training.php', ]; if ($_SERVER['REQUEST_URI'] == $base) $page = 'studio'; else { $page = substr($_SERVER['REQUEST_URI'], strlen($base)); } if (array_key_exists($page, $permit) || isset($_GET['lang'])) { require_once 'assets/header.php'; require_once $permit[$page]; require_once 'assets/footer.php'; } else if (isset($_GET['post'])) { require_once 'assets/header.php'; require_once 'view/blog.php'; require_once 'assets/footer.php'; } else{ header('HTTP/1.1 404 Not Found'); require_once 'view/404.php'; }
на сайте есть фильтрация с гет параметром и еще мультиязычность на гет хотелось красивые ссылки типо domain/blog/ru вместо domain/blog?lang=ru и domain/blog/avtor вместо domain/blog?post=avtor
Ну сделай ключи в твоем массиве двухкомпонентными, например blog/ru. P.S. Если ты работаешь с $_SERVER['REQUEST_URI'], вот эту всю муть можно смело в топку отправлять: Код (Text): ?$1 [L,QSA] RewriteRule ^/blog/([a-z]+)/$ blog?post=$1 [L] Флаг L можешь оставить. --- PHP: if ($_SERVER['REQUEST_URI'] == $base) $page = 'studio'; Ну сделай PHP: $permit = [ '' => 'view/studio.php', и потом просто, например, PHP: $page = strval(substr(... --- PHP: || isset($_GET['lang']) Что это? почему просто ИЛИ? --- Код (Text): require_once Используй абс. пути, например ROOT_PATH.'assets/header.php' (хотя подобную фигню лучше убрать из корня; в assets обычно лежат клиентские скрипты и прочий статик обвес). По этой же схеме можно использовать относительные пути, имеющие спец. назначение, когда константа содержит пустую строку (см. этот коммент). --- Из $_SERVER['REQUEST_URI'] нужно прежде выделить путь (отделить строку параметров). Например, как показано тут. --- Добавлено --- P.P.S. Вообще с языком нужно думать. У нас обычно разные языковые версии на разных (под)доменах располагаются. На разных, Карл. Возможно, вариант с GEТ-параметром для тебя будет более удачным. Или на худой конец используй первый компонент пути, а не последний. --- Добавлено --- Что касается фильтрации и роутинга, есть такой подход сразу выделять из адреса отдельные компоненты пути и значения GET-параметров. Я упрощенно писал про фильтрацию с использованием этого подхода здесь: https://gency.ru/filter-items-by-level-of-hierarchy https://gency.ru/filter-items-by-two-independent-properties --- Добавлено --- Хотя нет. Для тебя это пока лишняя инфа, т.к. ты только по одному значению фильтруешь. Лучше здесь запросы посмотри: https://gency.ru/g-drive-blog
в htaccess RewriteRule ^/blog/([a-z]+)/$ blog?post=$1 [L] --- Добавлено --- оно должно преобразовать путь не так ли?
Я в курсе, что есть такая. И даже когда-то пытался тебе объяснить, почему в коде моей статьи про ед. точку входа она не используется.
Зачем тебе это. Ты же используешь в скрипте $_SERVER['REQUEST_URI']. Лучше выкинь все лишнее из .htaccess. Это лишняя завязка скрипта на конфиги сервера.
зачем дополнительные педали крутишь в велосипед ? Код (Text): AddDefaultCharset UTF-8 DirectoryIndex index.php RewriteEngine On # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [L,R=301] # Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] принимаешь все: PHP: $_SERVER['REQUEST_URI'] Разбираешь: https://www.php.net/manual/ru/function.parse-url.php Все ! --- Добавлено --- С пост запросами определяешь: PHP: $_SERVER['REQUEST_METHOD'] == 'POST' else ...
Я спать. Вкратце: чтобы была возможность ловить адреса формата /path? (только с вопросом на конце, без «тела» строки параметров).
@Hovik, короче работай напрямую с исходными адресами без лишних искажений/преобразований. Это круто, например для той же фильтрации: / или /blog – список без фильтрации – не добавляется доп. условие на выборку /author/mike – фильтрация по автору – добавляется доп условие `author`='mike' /category/php-mysql-faq – фильтрация по категории – добавляется доп условие `category`='php-mysql-faq' В последних двух строчках значения (как и имена) полей берутся для запроса прямо из пути. (На самом деле это не совсем так, но об этом потом расскажу, если будет интересно.) --- Добавлено --- Для чего потребуется. Даже если не потребуется, чтобы просто различать /path и /path?
Странно... PHP: $url = 'http://www.writephponline.com/path?'; $this -> u = parse_url ( $url ); if ( strpos ( $url, '?' ) !== false ) {...}
вот фильтрация PHP: function selectBlog($request , $id = FALSE ){ $request = 'SELECT * FROM admin_post_add'; if ($id) { if ($id == 'hovik') { $request .= " WHERE post_author = 'Hovik Ghambaryan' LIMIT 5"; }else if($id == 'hrach'){ $request .= " WHERE post_author = 'Hrach Poxosyan'"; }else if($id == 'armine'){ $request .= " WHERE post_author = 'Armine Saroyan'"; }else if($id == 'all'){ $request = "SELECT * FROM `admin_post_add`"; } else{ echo '<h3 class="text-center w-100">something is wrong the participant has no posts</h3>'; exit(); } } global $conn; $posts = $conn->query($request); return $posts; }; --- Добавлено --- а это в блог.пхп PHP: $postsAll = 'SELECT * FROM `admin_post_add`'; if(isset($_GET['post'])){ $id = strip_tags($_GET['post']); $posts = selectBlog($postsAll, $id); } else{ $posts = selectBlog($postsAll); }
@MouseZver, и чЁ? Когда потребуется, там по логике вопрос должен быть частью компонента пути. Но ты пиши, потому что использование в представленном мной коде (условия с) $_SERVER['QUERY_STRING'] тоже не айс. Дам ссылку на твои труды, кому надо. Спасибо за внимание. --- Добавлено --- @Hovik, ты при добавлении очередного автора собираешься в код лезть? Про GET-параметры тебе уже тут много написали.
Да про гет я и сам знаю не мало просто сейчас голова тупит и не могу не чего сделать --- Добавлено --- такой запрос должна отправлять гет запрос http://localhost/strides.website/blog/hovik http://localhost/strides.website/blog?post=hovik
К пред посту. Короче рассказываю, как это работает на сайте по многочисленным представленным в этой теме ссылкам (за которые прошу прощение у всех присутствующих; я обычно не «спамлю» так нагло ). Для страницы по адресу /author/mike сначала идет запрос к таблице авторов для выбора записи по слагу mike (он обычно выполняется движком автоматом, поэтому программист конкретного сайта особо не парится, как это происходит). Запрос возвращает в том числе и числовой id автора, по кот. программист уже делает выборку принадлежащих этому автору, т.е. в данном случае мне, материалов. В статье (и комментах) по последней ссылке моя жена вроде бы об этом подробно писала. Я это понял. Говорю, не надо преобразовывать /blog/hovik в /blog?post=hovik, но в общем дело твое. Думал, что ты сюда за советом пришел, а не просто показать, чего добился --- Добавлено --- Видел эту демку? http://g09.ru/gency-demo-2/single-entry-point?p=1 (вместо single-entry-point можешь написать hovik и т.п.)
Вообще адресация – это важный момент при разработке сайта. Лучше сразу продумать адреса различных типов страниц. Даже немного наперед, когда их все сразу создавать не собираешься. Например, ты для фильтра по авторам выбрал формат /blog/тут_автор, но ты уверен, что у тебя, например, не будет в блоге фильтра по категориям, для которого адрес этого формата (/blog/тут_категория) может быть более предпочтителен? Или ты будешь вперемешку для обоих фильтров использовать один и тот же формат адреса (это сложнее технически)?
а в чем причина нехотелки - проверить на существовании "?" в сыром урл, а после выполнять нужные действия, чем городить регулярки/лишние движения ?
Я точно не знаю. Тот код писал не я. Как выше написал, там основная задача – не просто 404-ую выдать для путей с завершающим вопросом, а чтобы этот вопрос мог быть частью последнего компонента пути, например для /a/b? чтобы выделялись a и b?, но в общем конечно можно как-то по-другому проверять наличие этого вопроса и, если он есть, добавлять его в конец последнего компонента (когда вопрос «съедается» при выделении компонентов). А почему ты упорно навязываешь parse_url для разделения пути и строки параметров, когда для этого есть более простая ф-ция, я понять не могу. Название parse_url хорошо ассоциируется с выполняемым действием? Или просто хочешь, чтобы у всех было, как у тебя? Web-серверы, кстати, это делают более лаконичными ф-циями, больше похожими на explode('?', $_SERVER['REQUEST_URI'], 2).
процитируй мое сообщение об навязывании. Напомнил про милторга, который в свою очередь делает те же действия, только через регулярку все гонит. Ты дробишь php одной функцией - explode Я дроблю сразу на части без возни дальнейшей - php одной функцией Дальше, тебе нужно работать с патчем... Снова действие... снова вызов функции для дробления. У меня же - все готово для дальнейшего прогона. Пурпурно - фиолетово. Лишь узнаю логику других действий, почему так а не так. На сколько помню, мы через это проходили и через n-месяцев, пишешь противоположную принадлежность часть продукта.