PHP маршрутизация с Codeigniter (заголовки в URL для SEO)

У меня есть несколько вопросов о маршрутизации с Codeigniter. Сейчас я делаю следующее:

$route['articles/(:num)'] = 'articles/view/$1'; // $1 will contain an ID

Это означает, что example.com/articles/123 будет отлично работать и загружать статью с идентификатором 123. Но я также хочу иметь возможность добавить заголовок aticle & # xB4; в URL (для SEO). Пример: example.com/articles/123/article-title

То, что я хочу - это почти то же самое, что и переполнение стека: stackoverflow.com/questions/123/the-title

Как я могу это сделать?

Мне также интересно, как работает переполнение стека. Если я перейду к stackoverflow / questions / 111, заголовок будет автоматически добавлен в URL. Это делается с помощью php redirect ()?

 Gerep12 июн. 2012 г., 19:23
Но я думаю, что это сработает, ты проверил? Я думаю, что, поскольку третий параметр(:any)
 user104399412 июн. 2012 г., 19:22
@Daniel Да, но я хочу, чтобы заголовок был необязательным, как здесь, в переполнении стека.
 Gerep12 июн. 2012 г., 19:30
Я сделал это, я знаю, что вы хотите сделать. Вы пытались создать один и тот же маршрутизатор с разными параметрами? Один с(:any) а другой без?
 Gerep12 июн. 2012 г., 19:20
ты пытался:$route['articles/(:num)/(:any)'] ? и при передаче этого третьего параметра вы должны заменить пробелы на- и не думаю, что есть необходимость в том, что было предложено Кристианом Джуппони
 user104399412 июн. 2012 г., 19:25
@ Даниель Да, (: любой) правильно, но я получаю & quot; Страница не найдена & quot; когда не добавляется заголовок.

Ответы на вопрос(3)

Вы можете создать маршрут несколько раз и с разными параметрами, например:

$route['articles/(:num)/(:any)']
$route['articles/(:num)']

Я хотел бы создать функцию с перенаправлением, добавив или нет заголовок к нему.

Надеюсь, поможет.

Решение Вопроса

Я не могу найти это знать, но IIRC (это было несколько месяцев назад). Вы можете использовать маршрут, как вы, а также добавить более конкретный маршрут, например

$route['articles/(:num)/(:any)'] = 'articles/view/$1/$2';
$route['articles/(:num)'] = 'articles/view/$1';

Как видите, оба сопоставляются с одним и тем же методом, который является своего рода «перегруженным»; Вы можете восполнить отсутствующий параметр, используя значение по умолчанию:

function articles($id,$slug = FALSE) 
{ }

и просто игнорируйте второй параметр в вашей статье поиска.

Что касается добавления заголовка, вы можете:

have a "slug" field in your database, created when the article is saved. You can use the comfortable url_title($title,'dash',TRUE) function (in the url helper), which takes the $title, uses the dash as separator, and make it all lowercase; use the above function and convert the title of the article (after you retrieved it from the database) "on-the-fly"; just check on the article() method if the 2nd parameter isn't false and you'll know if you need to create the slug or not;

Что касается того, как показывать слаг даже при использовании URL без него, вы можете сделать, как вы уже догадались, перенаправление, но, поскольку оба маршрута указывают на один и тот же метод, он ничего не изменит для вас.

Ох, остерегайтесь циклов при вызове перенаправления, проверьте внимательно;)

 12 июн. 2012 г., 19:35
Спасибо! Любая идея, как Stack Overflow делает для автоматического добавления заголовка, если он отсутствовал? PHP редирект () может быть?
 12 июн. 2012 г., 19:37
Нет, но я только что обновил свой ответ с моим предположением

L-адресом, который вы хотите использовать в качестве идентификатора. Позволь мне объяснить.

У вас есть этот стол

id
title
slug

когда вы сохраняете статью в свою базу данных, вы можете динамически создавать слаг, например:

id: 1
title: My first post
slug: 1-my-first-post

тогда вы можете использовать для этой страницы рекламный идентификатор slug (в данном случае 1-my-first-post):

www.example.com/articles/1-my-first-post

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

 12 июн. 2012 г., 19:21
Спасибо за предложение! Это, однако, не отвечает ни на один из моих вопросов.

Ваш ответ на вопрос