несколько способов сделать красивые url....что лучше?!

jeno

Новичок
несколько способов сделать красивые url....что лучше?!

добрый день

решил сделать красивые Url на своем CMS...во первых это красиво, а во вторых это полезно для поисковиков :) (всем известно что если url ведет на статическую страницу, например www.my.com/photoshop_tutorials.html, то поисковик (тот же гугл) учитывает и url в поиске ;) )

знаю по крайней мере 2 способа сделать красивые url:

вариант №1 "мод реврайт":

ссылки на странице выглядят красиво, например "www.my.com/news/342/" но на самом деле модреврайтом ссылка переделывается в "www.my.com/index.php?p=news&pg=342"

вариант нормальный, но имхо: 1.возможно не на всех хостингах есть реврайт, и 2.не очень хочется передрачивать каждый запрос :rolleyes:

вариант №2 "файл без расширения":

тут конечно тоже не обойтись без htaccess или переконфигурирования apache, но всеже без переделки все ссылок...
значит так, создаем в корне файл news, в htaccess (или в конфиге apache) пишем что этот файл выполняется как php файл, и все...
т.е.когда заходим по адресу: www.my.com/news/342/ на самом деле выполняется файл news в который передается значение 342

короче, все вроде просто и понятно...
вот только у меня счас запущен сайт, посещаемость несколько тысяч юзеров (ожидается еще больше), и хочется сделать все как можно лучше и стабильнее...

что вы предложите? (возможно даже есть и другие варианты :) )

п.с.вообще-то мой cms устроен так:
все линки ведут на index.php, а он уже инклудит модули...
примерно вот так:

index.php?p=news....
index.php?p=articles....
ит.д.

заранее всем спасибо!
 

AmdY

Пью пиво
Команда форума
boombick, ну зачем так грубо, СЕО тоже кушать хотят./
ссылки на странице выглядят красиво, например "www.my.com/news/342/" но на самом деле модреврайтом ссылка переделывается в "www.my.com/index.php?p=news&pg=342"
Это необязательно превращать в гет запрос, можно тащить из $_SERVER данные.
а вообщето многое зависит от пожеланий заказчика. можно сделать функцию makeURL($action, $controller, $module, $vars), которая будет формировать урл.
а ищо можно делать альянсы, когда короткий урл ассоциируется с длинным.
 

Фанат

oncle terrible
Команда форума
честно говоря, я не понял, почему во втором не нужно хм... менять все ссылки.
 

HraKK

Мудак
Команда форума
тут конечно тоже не обойтись без htaccess или переконфигурирования apache
На хостинге нету реврайта, но можно переконфигурировать апач? Не **** не себе ни нам мозги. Юзайте mod_rewrite
 

WP

^_^
По крайней мере некоторым поисковикам точно не плевать на урл :)

-~{}~ 01.12.07 19:55:

jeno
Юзай mod_rewrite и на крайняк ErrorDocument

-~{}~ 01.12.07 19:57:

Кстати советую вынести роутинг запросов в скрипт т.к. может встать необходимость перейти например на lighttpd или nginx, а там mod_rewrite нет.
 

phpdev2007

Новичок
WP
каким методом предлагайте вынести роутинг запросов в скрипт?
как мы можем передать запрос двух разных урлов к одному файлу?
/test/
/test2/
или вы предлагаете не делать одной точки входа запросов пользователя в систему? и дублировать весь код который нужен для обработки запроса пользователя? скажем грубо не код а порядок вызовов обработчиков запроса пользователей, что тоже есть дублирования.
 

shaelf

Новичок
Автор оригинала: phpdev2007
WP
каким методом предлагайте вынести роутинг запросов в скрипт?
как мы можем передать запрос двух разных урлов к одному файлу?
/test/
/test2/
или вы предлагаете не делать одной точки входа запросов пользователя в систему? и дублировать весь код который нужен для обработки запроса пользователя? скажем грубо не код а порядок вызовов обработчиков запроса пользователей, что тоже есть дублирования.
Самый простой вариант это посмотреть как устроено в ZF (zend framework). Получаешь урлу и разбираешь её:
/controler_name(?)/action_name/param1Name/param1Value/param2Name/param2Value
Контролеры использовать по вкусу. Из параметров собираешь массив (в простом случае) и передаёшь как параметр экшену (контролеру) или запихиваешь его в класс Request (чтобы можно через него пост и прочую ерунду дёргать) и передаёшь этот класс в контроллер (экшен).
 

phpdev2007

Новичок
shaelf
вы не внимательно прочитали тему! ZF использует как раз mod_rewrite для пересылки всех запросов пользователя на один файл! а уже потом да делит урл на параметры и так дальше как вы описали.

-~{}~ 03.12.07 00:46:

http://framework.zend.com/manual/ru/zend.controller.html#zend.controller.quickstart.go
7.1.2.3. Создайте свои правила перезаписи
 

vovanium

Новичок
ИМХО, самый удобный вариант такой.
Есть в Apache такая опция как Multiviews, если не включено в конфиге апача, то можно в .htaccess прописать
Options +Multiviews
в итоге спокойно скрипт news.php работает без указания расширения, типа

http://site.net/news/2007/12/02/123

GET/POST работают без всяких дополнительных извратов, параметры после имени скрипта (в данном случае "2007/12/02/123") передаются в $_SERVER['PATH_INFO'], их может быть любое количество и в любых вариациях, это уже дело конкретного скрипта-модуля, что с ними делать.
Также нормально работают различные комбинации типа

http://site.net/news/2007/12/02/?limit=50

Хотя такой способ лучше подходит для так сказать "native" ЧПУ (систем которые сами обрабатывают такие ссылки), а не переделок которым нужно ЧПУ-шный адрес сначала преобразовать в понятный для CMS адрес, который уже потом обрабатывается.
 

nerezus

Вселенский отказник
каким методом предлагайте вынести роутинг запросов в скрипт?
как мы можем передать запрос двух разных урлов к одному файлу?
Код:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?$1
 

bars80080

Новичок
у меня такой вот глупый вопрос, а нельзя ли зайти с другой стороны,
если требуется всего лишь красота ссылок, можно ли переправить путь в адресной строке уже после по факту?
 

Фанат

oncle terrible
Команда форума
поясни, что ты имеешь в виду.
после - чего? по факту чего?
 

AmdY

Пью пиво
Команда форума
Ой, постараюсь повторить то, что удалил Фaнат.
http://site.net/news/2007/12/02/?limit=50
Этот адрес напоминает небезызвестный салат. Зачем уходить от единообразия.
Я ничего не делал используя Multiviews, но мне кажется что он является не очень подходящим вариантом, так как вопрошатый в своём вопросе, что в его cms все линки идут на index.php
Ну и в довершение всего я приводил две ссылки http://phpclub.ru/detail/article/2001-01-16 и http://phpclub.ru/detail/article/2001-01-16/
Я считаю, что jeno не должен столь кардинально менять своё творение, и моё мнение никак не связано с местом моего проживания, политическим строем и религиозными верованиями, а основывается на здравом смысле и затратах.
 

vovanium

Новичок
Этот адрес напоминает небезызвестный салат. Зачем уходить от единообразия.
Этот адрес показывает возможности, не обязательно их использовать. Он позволяет использовать обычные GET формы, без необходимости править путь с помощью JS

К примеру не вижу ничего плохого в таком запросе
http://site.net/news/2007/12/?s=текст

В итоге выдаются новости за декабрь 2007 года, которые содержат слово "текст". В общем довольно гибко можно использовать.

что в его cms все линки идут на index.php
Я же написал что этот вариант лучше для чистых ЧПУшных движков. Так как поиск файла по имени, будет явно шустрее обработки реврайтом + поиск того же файла, но уже с расширением.

В принципе его вариант тоже не очень сложно переделать, просто создается скрипт (тот же news.php) в котором инклудится index.php, который уже делает что нужно.
Ведь по сути во всех нормальных CMS есть ядро которое вызывается при вызове любой страницы. А будет это index.php или какой-нибудь core.inc.php - это уже не столь важно. В любом случае нужно правки вносить в CMS, так как помимо того чтобы запускаться по ЧПУ, CMS должна еще эти ЧПУ ссылки уметь формировать (всякие пути по сайту, менюхи и т.п.).

AmdY
Я считаю, что jeno не должен столь кардинально менять своё творение, и моё мнение никак не связано с местом моего проживания, политическим строем и религиозными верованиями, а основывается на здравом смысле и затратах.
Ну это уже ему решать, что и как :) Ты же не знаешь в какой стадии его CMS находится, может он как раз её собрался серьезно переделать ;)
 

WP

^_^
Я сделал следующим образом. В среде Apache конфиг (.htaccess) выглядит так:
Код:
Options +FollowSymlinks
ErrorDocument 404 /en/error,404/
ErrorDocument 403 /en/error,403/
ErrorDocument 500 /en/error,500/
Options -indexes
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !/favicon.ico$
RewriteCond %{REQUEST_FILENAME} !/install.php$
RewriteCond %{REQUEST_FILENAME} !/js/
RewriteCond %{REQUEST_FILENAME} !/images/
RewriteCond %{REQUEST_FILENAME} !/files/
RewriteRule .* main.php
Далее идет парсинг REQUEST_URI. Схема такая - /язык/модуль,действие1,действие2/чтоугодно/чтоугодно...

И это довольно универсально, и конфиг для nginx не составило труда написать.
 
Сверху