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

ЧПУ для статей

20.07.2017, 01:12. Показов 668. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, форумчане

Была задача сделать ЧПУ для статей по такому типу: http://site.ru/6-statya-6.html
То есть id статьи, её название транслитом и .html в конце.

Задачу выполнил таким образом
Написал функцию:
PHP
1
2
3
4
5
    function translit($str) {
        $rus = array('А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', ' ', '(', ')', '"', ',', ':', '!');
        $lat = array('a', 'b', 'v', 'g', 'd', 'e', 'e', 'gh', 'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh', 'sch', '', 'y', '', 'e', 'yu', 'ya', 'a', 'b', 'v', 'g', 'd', 'e', 'e', 'gh', 'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh', 'sch', '', 'y', '', 'e', 'yu', 'ya', '-', '', '', '', '', '', '');
        return str_replace($rus, $lat, $str);
    }
Потом просто использовал её на ссылке статьи:
PHP
1
2
3
<div class="article-head">
    <a href="<?=PATH?><?=$home['articles_id']?>-<?=translit($home['name'])?>.html"><?=$home['name']?></a>
</div>
Вроде всё получилось, но есть одна проблема

Если пользователь введёт несуществующий id - будет 404, так и должно быть
Если вместо .html пользователь введёт что-то другое - тоже будет 404

Но если пользователь введёт вместо транслитного названия статьи что нибудь другое, то статья всё равно нормально откроется

Подскажите, пожалуйста, как сделать, чтобы, если пользователь вводит несуществующее название в адресной строке тоже выходила ошибка 404?
Чтобы у одной статьи был всего один url адрес

Извините, если вопрос глупый
Я совсем новичок в PHP

PS: Извините, если назвал тему немного не по теме
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.07.2017, 01:12
Ответы с готовыми решениями:

Вид ЧПУ на движке статей
Здравствуйте. На одном сайте установлен движок для статей. Добавляемые статьи имеют вид адреса такой...

Каталоги статей, сколько статей стоит размещать
У меня вот такой вопрос. В нете существует, достаточно много бесплатных каталогов статей, из них не так много достойных. Я вот для себя...

PrestaShop ЧПУ работает, но с админки перенаправляет без ЧПУ. Так и должно быть?
Здравствуйте. Версия Prectashop 1.6.0.9. Суть в том, что если я сразу перехожу по адресу localhost/www/presta, то и дальше путешествуя...

8
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
20.07.2017, 08:30
Цитата Сообщение от CyberEeOne Посмотреть сообщение
как сделать, чтобы, если пользователь вводит несуществующее название в адресной строке тоже выходила ошибка 404?
PHP
1
2
if($_SERVER['REQUEST_URI'] !== '/' . $home['articles_id'] . '-' . translit($home['name']) . '.html')
    echo '404';
1
55 / 55 / 21
Регистрация: 01.03.2016
Сообщений: 594
20.07.2017, 19:51
CyberEeOne, я бы сделал проверку только по id, как у вас сейчас. А название в ссылке как бонус, что бы сохранять было быстрее...

Добавлено через 33 секунды
Это работает быстрее.
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
20.07.2017, 19:57
Цитата Сообщение от 53ifbb Посмотреть сообщение
я бы сделал проверку только по id, как у вас сейчас
Плохо для SEO.
0
 Аватар для CyberEeOne
0 / 0 / 0
Регистрация: 15.12.2016
Сообщений: 35
20.07.2017, 20:00  [ТС]
Jodah, Спасибо большое)

Добавлено через 2 минуты
53ifbb, Jodah прав.
У одной страницы должен быть только один адрес
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
20.07.2017, 20:12
CyberEeOne, правда я предпочитаю в таких ситуациях отдавать 301-ый редирект. Если кто-то решил поменять url у старой статьи, редирект не даст пропасть весу страницы.

Т.е. проверяем id, затем полный url. Если статья с таким id есть, но url другой - редирект.
0
 Аватар для CyberEeOne
0 / 0 / 0
Регистрация: 15.12.2016
Сообщений: 35
20.07.2017, 22:03  [ТС]
Jodah, Хорошо, спасибо

Добавлено через 1 час 0 минут
Jodah, Извините, у меня ещё вопрос
Я хочу сделать, чтобы, если пользователь вместо названия в url вводит несуществующее - переадресация на ту же статью с правильным названием
А если он вводит несуществующий выходило сообщение "Статьи с таким id не существует"
Как на этом сайте - http://kinogo.club/6788-forsazhs-8-2017.html

Сделал такое условие ($articles - проверка есть ли статья с таким id)
<?php if($articles && $_SERVER['REQUEST_URI'] == '/' . $url_article['articles_id'] . '-' . translit($url_article['name']) . '.html'): ?>

Данные статьи

<?php else: ?>
<?php redirect(PATH.$url_article['articles_id']."-".translit($url_article['name']).".html"); ?>
<?php endif ?>

Редирект сделал, всё работает, но не знаю, как сделать, чтобы если меняют id - было одно значение else. А если меняют название (транслит) - редирект

Заранее спасибо

Добавлено через 13 минут
Цитата Сообщение от Jodah Посмотреть сообщение
проверяем id, затем полный url. Если статья с таким id есть, но url другой - редирект.
Просто не очень понимаю, как именно это реализовать
С помощью if?
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
20.07.2017, 22:08
CyberEeOne, примерно так.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$article = $pdo->query('SELECT * FROM `article` WHERE `id` = ' . (int) $id)->fetch();
 
if(!$article)
    echo 'Ошибка 404';
 
$full_url = '/' . $article['id'] . '-' . translit($article['name']) . '.html';
 
if($full_url !== $_SERVER['REQUEST_URI'])
    echo 'Редирект 301';
 
echo 'Выводим статью';
1
Заблокирован
21.07.2017, 18:50
Цитата Сообщение от CyberEeOne Посмотреть сообщение
Подскажите, пожалуйста, как сделать, чтобы, если пользователь вводит несуществующее название в адресной строке тоже выходила ошибка 404?
В первую очередь необходимо послать HTTP заголовок для поисковых ботов
PHP
1
header("HTTP/1.1 404 Not Found");
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.07.2017, 18:50
Помогаю со студенческими работами здесь

Был сайт без ЧПУ, потом с "некрасивыми" ЧПУ
Сайт на Joostina. Сперва был без ЧПУ. Потом после индексации включили штатный ЧПУ Жустины. Там ЧПУ вида site.ru/content/1/123.html Потом...

Выбор книги или статей для создания приложений под Android (клиент для сервера)
С какой книги посоветуете начать изучение (желательно сразу на 4 версии). Важно что бы была глава про то как парсить json с сервера...

Разные правила в nginx для редиректов и создания ЧПУ для каждого поддомена и основного домена
Всем привет. Хочу перекинуть сайт с Апача на nginx + php-fpm Сайт только что перевел на https. Использую ISP manager, там...

Шаблон для статей
На сайте есть тупие редактори. Надо както шаблонизирувать вивод статей. Вивод производитса в две колонки. Можно както ето сделать?

Красивый блок для статей
Приветствую всех. Хочу на сайте разместить блок со статьями. Картинка и рядом описание статьи справа. В блоке шесть статей. А сам блок как...


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

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