Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 09.10.2019
Сообщений: 24

Организация метатегов по маске $_SERVER['REQUEST_URI'];

13.11.2019, 12:41. Показов 2424. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте
Есть сайт на пхп, абсолютно не оптимизированный под СЕО. В файле хедера прописаны теги title, description и т.д. На каждой странице сайта они повторяются, но их уже поисковики не берут т.к. смотрят на то что прописано в тегах head то бишь в файле хедера. и получается что все страницы сайта с одинаковым описанием и т.д.
Других мыслей кроме как смотреть на урл и в зависимости от этого выдавать теги у меня нет. Вопрос синтаксиса. Условно говоря на сайте есть страницы, которые идут сразу после имени домена, есть вида https://домен/viewstr/имястранички https://домен/viewart/имястраничкии т.д.
Как именно прописать эти условия?
if($_SERVER['REQUEST_URI'] == '/') это я так понимаю главная будет
а вот дальше у меня пошли сложности
if($_SERVER['REQUEST_URI'] == '/****') где условные звездочки это уже имя странички. Но надо исключить viewstr и viewart т.е. чтобы выполнялась маска только под имена https://домен/имястранички
Далее директории
if($_SERVER['REQUEST_URI'] == '/viewstr/*****') соотв тут звездочки это любое имя если есть после имени домена viewstr, маска для адресов типа

Помогите пожалуйста с маской. Мне достаточно двух примеров - страничка после имени домена, и страничка после имени домена/директории
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.11.2019, 12:41
Ответы с готовыми решениями:

$_SERVER['REQUEST_URI']
Вот код: if($_SERVER == "/site.html"){} А как сделать так, чтобы эта функция применялась для "/site.html" ?

$_SERVER['REQUEST_URI']
Здравствуйте! Помогите пожалуйста разобраться. На сайте есть код, который через шлюз отправляет смс. Но почему-то они отправляются...

$_SERVER['REQUEST_URI']
такая проблема есть страница /catalog/ но тут не важно, и просто /index.php ответ дают неверный $_SERVER выдает /js/script.js или...

15
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
13.11.2019, 13:11
PHP
1
2
3
4
5
6
7
8
9
<?php
$url = trim($_SERVER['REQUEST_URI'], '/');
 
if(in_array($url[0], ['viewstr', 'viewpart'], true))
    $title = $url[1];
else
    $title = $url[0];
 
echo $title;
Что-то вроде этого, не проверял.

Цитата Сообщение от Kojuh Посмотреть сообщение
Других мыслей кроме как смотреть на урл и в зависимости от этого выдавать теги у меня нет.
А как же семантическое ядро и всё такое?
0
0 / 0 / 0
Регистрация: 09.10.2019
Сообщений: 24
13.11.2019, 13:44  [ТС]
Так выдается первая буква названия страницы
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
13.11.2019, 13:47
Упс, растяпа

PHP
1
2
3
4
5
6
7
8
9
$url = trim($_SERVER['REQUEST_URI'], '/');
$url = explode('/', $url);
 
if(in_array($url[0], ['viewstr', 'viewpart'], true))
    $title = $url[1];
else
    $title = $url[0];
 
echo $title;
0
0 / 0 / 0
Регистрация: 09.10.2019
Сообщений: 24
13.11.2019, 13:52  [ТС]
Выдается урл страницы, без имени сайта и префикса. пока не очень догоняю как это может мне помочь
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
13.11.2019, 13:56
Kojuh, тогда я не понял задачу. Опишите подробней, что нужно получить из URL.
0
0 / 0 / 0
Регистрация: 09.10.2019
Сообщений: 24
13.11.2019, 14:11  [ТС]
Смотрите, какая задача. Сейчас мы имеем сайт, где все страницы имеют одинаковый дескрипшн, тайтл и т.д. Короче говоря все og теги одинаковые. На сайте есть подразделы, условно:
Статьи
Очерки
Инструкции.
Статьи находятся по следующему адресу:
https://домен/имястатьи
Очерки:
https://домен/viewstr/имястранички
Инструкции
https://домен/viewart/имястранички

У каждого подраздела свои записи в базу. Соответственно что задумывается. По урлам идентифицировать тип записи на странице, выдирать из БД нужные параметры, и прописывать их в теги. Например:
Статьи:
PHP
1
2
3
4
5
6
if($_SERVER['REQUEST_URI'] == '/*') */ звездочка это типа любое название страницы
$url = trim($_SERVER['REQUEST_URI'], '/');
$url = explode('/', $url);
$query2 = $mysqli->query("SELECT * FROM `prefix_history_pay` WHERE `url`  = '".$url."' LIMIT 1"); */ лезем в бд в нужную таблицу для получения нужных данных
  $in_pay = $query2->fetch_assoc();
  $array = unserialize($in_pay['data'] );
Очерки:
PHP
1
2
3
4
5
6
if($_SERVER['REQUEST_URI'] == '/viewstr/*') */ звездочка это типа любое название страницы но в адресе должно быть viewstr
$url = trim($_SERVER['REQUEST_URI'], '/viewstr/');
$url = explode('/viewstr/', $url);
$query2 = $mysqli->query("SELECT * FROM `prefix_ocherk` WHERE `url`  = '".$url."' LIMIT 1"); */ лезем в бд в нужную таблицу для получения нужных данных
  $in_pay = $query2->fetch_assoc();
  $array = unserialize($in_pay['data'] );
HTML5
1
2
<meta property="og:title" content="<?=$array['title'];?>"/>
<meta property="og:description" content="<?=$array['opi'];?>"/>
Как это все сделать ума не приложу
0
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,884
13.11.2019, 20:22
Зачем вообще нужны какие-то условия, если у страниц данные уникальны? Просто добавьте во все таблицы одноименные "SEO-поля", выбирайте их в массив и выводите так, как показали.

Или вы не можете разделить код обработки HTTP-запросов по типам выводимых страниц? Это называется маршрутизация (роутинг). Есть разные способы ее выполнения. Описание самых популярных можно легко найти в Интернете.
0
0 / 0 / 0
Регистрация: 09.10.2019
Сообщений: 24
13.11.2019, 20:28  [ТС]
Решил вопрос вообще по другому
На типовые страницы добавил код:
PHP
1
2
3
4
5
6
7
8
9
10
11
$url69 = $_SERVER['REQUEST_URI'];
$query99 = $mysqli->query("SELECT * FROM `metatags` WHERE `url` = '$url69'");
  if ($query99->num_rows){
 
 
 }
 else {
     
     $mysqli->query("INSERT INTO `metatags` (`title`, `image`, `url`, `type`, `typeprojekt`)
                    VALUES (  'О сайте','/uploads/twitter.png', '$url69',  'article',  '4' )");
 }
Соответственно это пока позволит полегоньку набить базу всех существующих страниц. потом уже в файле темплейта буду по $_SERVER['REQUEST_URI'] запрашивать урл страницы, и если она есть в таблице, то будет автоматом заполняться все теги на ней
0
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,884
13.11.2019, 20:34
Лучше бы ответили на мой вопрос.

Цитата Сообщение от Kojuh Посмотреть сообщение
На типовые страницы добавил код
Вы поаккуратнее с прямой вставкой данных в текст запроса

Добавлено через 1 минуту
Логика показанного ветвления совершенно не понятна. Что за INSERT?!
0
0 / 0 / 0
Регистрация: 09.10.2019
Сообщений: 24
13.11.2019, 20:45  [ТС]
Отвечаю на вопрос.
Сайт делала еще более криворукая обезьяна чем я) Как у него роутинг организован, и вообще что пил человек когда все это писал - неизвестно. Скажем канонический урл такой: https://домен/viewstr/имястранички но спокойно прокатит и что то типа https://домен/viewstr/имястранички=&type11 на 404 не выкинет, покажет именно каноническую страницу. С этим еще предстоит разбираться, т.к. все вот эти возможные комбинации весело сьедает поисковый робот и потом начинает выносить мозг, добавлением и выкидыванием из индекса.

Теперь что касаемо костылей, что я тут понаставил. Ну реально с моим уровнем я ничего придумать не смог иного
Работает по следующему принципу. Кто то заходит на определенную страницу. Идет обращение к таблице БД, где прописаны все данные по тегам. Если не видит страницы, соответствующей урлу, то делает новую запись в таблицу. соотв когда будет следующий заход на эту же страницу, в базе будет запись, соответствующая этому урлу и таблицу скрипт трогать не будет.
0
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,884
13.11.2019, 21:13
Цитата Сообщение от Kojuh Посмотреть сообщение
на 404 не выкинет, покажет именно каноническую страницу.
Игнорируется строка параметров. Иногда бывает, что показывает "каноническую страницу", но со статусом 404. Однако так скорее мог бы сделать профессионал, чем "криворукая обезьяна"

Цитата Сообщение от Kojuh Посмотреть сообщение
Работает по следующему принципу. Кто то заходит на определенную страницу. Идет обращение к таблице БД, где прописаны все данные по тегам. Если не видит страницы, соответствующей урлу, то делает новую запись в таблицу. соотв когда будет следующий заход на эту же страницу, в базе будет запись, соответствующая этому урлу и таблицу скрипт трогать не будет.
Не зря я плакалъ Срочно исправляйте.

Добавлено через 5 минут
Вообще-то я прежде всего спрашивал это:
Цитата Сообщение от estic Посмотреть сообщение
Зачем вообще нужны какие-то условия, если у страниц данные уникальны?
Но про роутинг тоже интересно. В принципе можно использовать тег rel canonical. До полного избавления от дублей очень многим далеко, не только вам. Если хотите достичь максимального "уровня просветления" в этом вопросе и при этом не используете utm- и другие подобные метки на вашем сайте, можно отдельно обсудить.
0
0 / 0 / 0
Регистрация: 09.10.2019
Сообщений: 24
13.11.2019, 21:17  [ТС]
Цитата Сообщение от estic Посмотреть сообщение
Просто добавьте во все таблицы одноименные "SEO-поля", выбирайте их в массив и выводите так, как показали.
Я то понимаю что Вам смешно. Однако я не совсем понимаю как это сделать. Получается:
1. При добавлении статьи нужно будет заполнять эти самые сео поля
2. Как быть со статичными страницами? для них теги все равно прописаны в одном файле темплейта
3. Как темплейту обьяснить из какой таблицы под какую страницу брать сео поля? по сути также по реквестурлу. у меня 12 таблиц с разными типами данных. И уже в некоторых файлах пришлось городить такие вещи. т.к. данные по статье весело раскиданы по разным таблицам. Тайтл в одной, превью в другой
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
$query98 = $mysqli->query("SELECT * FROM `prefix_history_pay` WHERE `id`  = '".$idzakaz."' LIMIT 1");
  $in_pay55 = $query98->fetch_assoc();
  $array = unserialize($in_pay55['data'] );
$query99 = $mysqli->query("SELECT * FROM `metatags` WHERE `url` = '/".$ind_url_proj."'");
  if ($query99->num_rows){
 
 
 }
 else {
     
     $mysqli->query("INSERT INTO `metatags` (`description`, `title`, `image`, `url`, `type`, `typeprojekt`)
                    VALUES ( '".$array['opi']."', '".$resq['title']."','https://сайт/uploads/".$resq['url_banner']."', '/".$ind_url_proj."',  'article',  '1' )");
 }
Цитата Сообщение от estic Посмотреть сообщение
Игнорируется строка параметров. Иногда бывает, что показывает "каноническую страницу", но со статусом 404. Однако так скорее мог бы сделать профессионал, чем "криворукая обезьяна"
В адресной строке остается весь тот мусор в адресе, который туда набить. Соответственно и $_SERVER['REQUEST_URI'] парсит его также с мусором. Помимо этого получаются также удивительные вещи. Скажем в подраздел vievstr добавлена некая статья с урлом lojka. По идее она должна быть доступна только по адресу https://домен/vievstr/lojka . Но через пару дней я вижу в яндекс вебмастере проиндексированные страницы со всеми подразделами которые есть на сайте, т.е. https://домен/vievstr/lojka https://домен/vievart/lojka https://домен/newbee/lojka https://домен/kompens/lojka и т.д. При переходе на них пустая страница. Я что то подобного нигде еще не видел.
0
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,884
13.11.2019, 22:09
1. Да. Это плохо?
2. Сделать динамичными. Если они полностью статичные, можно прямо в HTML-коде прописывать, хотя это и не очень удобно. При этом не понимаю, как полностью статичные страницы связаны с каким-то там "файлом темплейта". Объясните.
3. Никак. "Темплейт" просто принимает данные. Подготовку данных для шаблона, при необходимости выбор нужного шаблона осуществляет другой код.

Цитата Сообщение от Kojuh Посмотреть сообщение
И уже в некоторых файлах пришлось городить такие вещи. т.к. данные по статье весело раскиданы по разным таблицам. Тайтл в одной, превью в другой
Вот это скорее всего большая ошибка. В принципе нормально, когда данные для страницы выбираются из разных таблиц, может быть даже нормально, когда данные передаются в шаблон в нескольких массивах (хотя обычно для основного содержимого предварительно делают слияние на PHP или даже на SQL: LEFT JOIN и т.п.). Но "тайтл" отдельно от "превью" - это странно.

На код с INSERT я без слез смотреть не могу. Либо присоединение (таблицы) метатегов (LEFT JOIN) по числовому идентификатору, либо их размещение в той же таблице, как я ранее вам написал, что вполне естественно.

Цитата Сообщение от Kojuh Посмотреть сообщение
Помимо этого получаются также удивительные вещи.
Явно проблемы с маршрутизатором. Нужно смотреть код.

Добавлено через 8 минут
В некоторых случаях в шаблонах могут встречаться такие ветвления, о которых мы говорим. Но разбор $_SERVER['REQUEST_URI'] - это не уровень шаблонов. Используемые в них условия должны быть более высокоуровневыми, например is_category(), is_static_page() и т.п.
0
0 / 0 / 0
Регистрация: 09.10.2019
Сообщений: 24
13.11.2019, 22:15  [ТС]
Цитата Сообщение от estic Посмотреть сообщение
1. Да. Это плохо?
2. Сделать динамичными. Если они полностью статичные, можно прямо в HTML-коде прописывать, хотя это и не очень удобно. При этом не понимаю, как полностью статичные страницы связаны с каким-то там "файлом темплейта". Объясните.
1. Не очень хорошо. Двойная работа. Сейчас при добавлении статьи уже добавляется превью, урл, тайтл и т.д Что можно использовать в качестве тегов. Проблема что сейчас это все раскидано по 4 таблицам, и потом уже во фронтенде это и собирается с 4 разных таблиц.
2. Это страницы, типа "о нас", "статьи" и т.д. Текст пишется в админку через базу. А структура сайта такова грубо говоря. Есть темплейт с хедером, футером, менюхами и т.д., то что есть на каждой странице сайта. А внутри в нем уже непосредственно все страницы сайта показываются. Поэтому если теги я пропишу внутри статичной страницы, их просто ни один робот не увидит, он будет смотреть то, что прописано в теге head/ А head в темплейте)))
Цитата Сообщение от estic Посмотреть сообщение
На код с INSERT я без слез смотреть не могу. Либо присоединение (таблицы) метатегов (LEFT JOIN) по числовому идентификатору, либо их размещение в той же таблице, как я ранее вам написал, что вполне естественно.
Мы лаптем щи хлебаем, так что иных команд для вставки новой записи в БД, я просто не знаю)
0
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,884
13.11.2019, 22:54
Еще такой вариант ветвления для надежности можно использовать, но только не для всех полей, а для тех, которые действительно могут отсутствовать:
PHP
1
2
3
<?php if (isset($array['description'])): ?>
    <meta name="description" content="<?= esc($array['description']) ?>">
<?php endif; ?>
Добавлено через 9 минут
Цитата Сообщение от Kojuh Посмотреть сообщение
1. Не очень хорошо. Двойная работа. Сейчас при добавлении статьи уже добавляется превью, урл, тайтл и т.д Что можно использовать в качестве тегов. Проблема что сейчас это все раскидано по 4 таблицам, и потом уже во фронтенде это и собирается с 4 разных таблиц.
Вот и используйте. Вы сами себе создали проблему, а теперь пытаетесь ее усиленно решать. Очень часто "превью" используется в качестве "description" и т.п. Но если даже нужно разделить, в чем проблема? Сделайте два отдельных поля.

Цитата Сообщение от Kojuh Посмотреть сообщение
2. Это страницы, типа "о нас", "статьи" и т.д. Текст пишется в админку через базу. А структура сайта такова грубо говоря. Есть темплейт с хедером, футером, менюхами и т.д., то что есть на каждой странице сайта. А внутри в нем уже непосредственно все страницы сайта показываются. Поэтому если теги я пропишу внутри статичной страницы, их просто ни один робот не увидит, он будет смотреть то, что прописано в теге head/ А head в темплейте
Поймите, ничто не мешает использовать "поля страницы" в любой ее части, в шаблоне любой ее части (в "хедере"). Нет практически никакой разницы между
PHP
1
<title><?= $array['title'] ?></title>
и
PHP
1
<h1><?= $array['title'] ?></h1>
(Хотя содержимое первого тега может быть более "развернутым", чем второго, но это мелочи: я могу хоть через запятую приписать в первом теге ' / ', $site['title']).

Цитата Сообщение от Kojuh Посмотреть сообщение
Мы лаптем щи хлебаем, так что иных команд для вставки новой записи в БД, я просто не знаю
Зачем вообще что-то вставлять? Это что панель управления (админка) сайта?

Добавлено через 12 минут
Только в общих частях шаблона используйте те поля, которые имеются у всех страниц, или окружите использование каждого такого поля ветвлением, пример которого я выше написал, или вместо ветвления используйте функцию представления, когда это уместно, например:
PHP
1
<meta name="description" content="<?= if_isset('description') ?>">
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.11.2019, 22:54
Помогаю со студенческими работами здесь

$_SERVER['REQUEST_URI']
адрес сайта site.ru/razdel/ а глобальная переменная говорит, что site.ru/razdel/bt.png как можно это побороть где искать ошибку? ...

Не работает case с $_SERVER['REQUEST_URI']
код: switch ($_SERVER) { case &quot;/shop/сайт/&quot;: echo 'dfg'; break; default: echo 'Hell'; ...

Как вывести $_SERVER['REQUEST_URI '] в index.php, если директории не существует?
Доброго времени суток! Задался вопросом. Файл index.php у меня выводится при введении имени домена в браузере. Я хочу ввести...

Сопоставление ссылки в коде с REQUEST_URI по маске
Здравствуйте. Буду рад, если поможете мне с таким вот вопросом: У меня есть ссылки вида адрес_сайта/index.php?action=11 (чуть сократил...

Параметр /?* для if($_SERVER["REQUEST_URI"]=="/")
Здравствуйте, уважаемые! Подскажите пожалуйста: Горе верстальщик мне сделал сайт на joomle и вывел весь контент условиями в главном...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru