Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Apache

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Красивые ссылки на mod_rewrite
 
 автор: Иван   (29.10.2005 в 15:57)   письмо автору
 
 

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

www.server.ru/catalog/edit.php?action=edit&id=21
на
www.server.ru/catalog/edit_1_21.html

если это вообще возможно, то как составить RewriteRule ?

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

примерно так
www.server.ru/catalog/index.php?cat=4&sortid=6&sortorder=asc
www.server.ru/catalog/index.php?cat=3&sortid=8&sortorder=desc
www.server.ru/catalog/index.php?page=17&cat=76&sortid=4&sortorder=desc
www.server.ru/catalog/index.php?page=3&cat=76
www.server.ru/catalog/index.php?page=1

тоесть некоторые параметры могут менятся, или их могут не быть

что с такой ссылкой можно придумать, чтобы смотрелась покрасивее?
хотелось чтобы выглядело примерно так
www.server.ru/catalog/sort_3_76_4_2.html

тоесть через прочерк передавались параметры, как это реально сделать?

сейчас у меня с условием


RewriteRule ^cat_([0-9]*)\.html$ catalog/index.php?cat=$1


ссылки выглядят так

www.server.ru/catalog/cat_4.html
в место
www.server.ru/catalog/index.php?cat=4

поэтому хотелось чтобы все ссылки были одинаковыми

   
 
 автор: glsv (Дизайнер)   (29.10.2005 в 18:56)   письмо автору
 
   для: Иван   (29.10.2005 в 15:57)
 

В большим количеством параметров уже не так изящно получается.
Я бы предложил обыграть вот такую схему

www.server.ru/catalog/index.php?cat=4&sortid=6&sortorder=asc
www.server.ru/catalog/cat/4/sortid/6/sortorder/asc/


www.server.ru/catalog/index.php?page=17&cat=76&sortid=4&sortorder=desc
www.server.ru/catalog/cat/76/sortid/4/sortorder/desc/page/17


www.server.ru/catalog/index.php?page=3&cat=76
www.server.ru/catalog/cat/76/page/3


Я, кстати, совсем не уверен, что вот такие ссылки
www.server.ru/catalog/sort_3_76_4_2.html
или такие
www.server.ru/catalog/cat/76/sortid/4/sortorder/desc/page/17
являются более красивыми и понятными, чем обычно. Порой становится даже хуже.

   
 
 автор: Иван   (29.10.2005 в 19:40)   письмо автору
 
   для: glsv (Дизайнер)   (29.10.2005 в 18:56)
 

это тоже вариант, можно даже и так оставить, приколько,

но вот как это все сотворить?

кстати, почему ты считаешь свой вариант не красиво, есть другое решение?

   
 
 автор: glsv (Дизайнер)   (30.10.2005 в 00:09)   письмо автору
 
   для: Иван   (29.10.2005 в 19:40)
 

> почему ты считаешь свой вариант не красиво, есть другое решение?
По мне - он ужасен :)
Лично мне читать такой URL сложнее и он более труден для понимания.
Он ничуть не улучшает восприятие и читабельность URL-а (а ведь к этому стремились). Но требует дополнительных действий по его преобразованию. А дополнительные операции всегда повышают вероятность ошибки.

Но других решений не знаю.

>но вот как это все сотворить?
Можно двигаться вот в таком направлении

RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteRule ^([^/]*)/([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)$ catalog/index.php?$1=$2&$3=$4&$5=$6

Используя следующую логику в URL

www.server.ru/параметр/значение/параметр/значение/параметр/значение/параметр/значение

   
 
 автор: Иван   (30.10.2005 в 13:21)   письмо автору
 
   для: glsv (Дизайнер)   (30.10.2005 в 00:09)
 

Спасибо большое, и у меня ещё один такой вопрос, пытаюсь сделать такие ссылки

www.server.ru/news/2005/11/23/878.html

из

www.server.ru/index.php?cat=news&y=2005&m=11&d=23&n=878


RewriteRule ^([a-zA-Z]*)?/?([0-9]{4})?/?([0-9]{1,2})?/?([0-9]*)?/?([0-9]*).html$ /index.php?cat=$1&y=$2&m=$3&d=$4&n=$5


думаю тут в принципе всё понятно, так вот, все работает присутствии $5.html, но как только я даляю т.е так
www.server.ru/news/2005/11/23/
то выводиться 404 ошибка

   
 
 автор: Иван   (31.10.2005 в 20:42)   письмо автору
 
   для: Иван   (30.10.2005 в 13:21)
 

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

http://localhost/sitenews/news/2005/02/26/121.html
в место
http://localhost/sitenews/news_list.php?category=news&y=2005&m=02&d=26&nid=121

по регулярке

RewriteRule ^([a-zA-Z]*)?/?([0-9]{4})?/?([0-9]{1,2})?/?([0-9]{1,2})?/?([0-9]*)/$ sitenews/news_list.php?category=$1&y=$2&m=$3&d=$4
RewriteRule ^([a-zA-Z]*)?/?([0-9]{4})?/?([0-9]{1,2})?/?([0-9]{1,2})?/?([0-9]*)?/?.html$ sitenews/news_review.php?category=$1&y=$2&m=$3&d=$4&nid=$5


то от сюда видно что подрробная новость выводиться через файл news_review.php
а список новостей выводится через news_list.php

всё работает как нужно, проблема заключается только водном, почему когда я набираю ссылку
http://localhost/sitenews/ или так http://localhost/sitenews/index.php да любой другой файл то мне выводиться сообщение о том что нет такой новости, сообщение выводиться через файл news_list.php
так вот как сделать чтобы этого небыло, и страница грузилась через файл index.php поскольку это главная страница

   
 
 автор: glsv (Дизайнер)   (01.11.2005 в 23:32)   письмо автору
 
   для: Иван   (31.10.2005 в 20:42)
 

Хм… а у меня все отлично отрабатывает.
http://localhost/sitenews/ и http://localhost/sitenews/index.php открывает именно index.php в директории sitenews.

Вы можете наблюдать за преобразованиями, которые выполняет Apache. Добавьте в httpd.conf директивы

RewriteLog logs/mysite-rw.log
RewriteLogLevel 9

9 – максимальный уровень детализации логов

   
 
 автор: Иван   (02.11.2005 в 04:38)   письмо автору
 
   для: glsv (Дизайнер)   (01.11.2005 в 23:32)
 

вот сейчас нормально работает

RewriteBase /sitenews/
RewriteRule ^[a-zA-Z]*/([a-zA-Z]*)?/?([0-9]{4})?/?([0-9]{1,2})?/?([0-9]{1,2})?/?([0-9]*)?/{0,1}$ news_list.php?category=$1&y=$2&m=$3&d=$4
RewriteRule ^[a-zA-Z]*/([a-zA-Z]*)?/?([0-9]{4})?/?([0-9]{1,2})?/?([0-9]{1,2})?/?([0-9]*)?/?.html$ news_review.php?category=$1&y=$2&m=$3&d=$4&nid=$5

http://localhost/sitenews/sport/2005/02/26/120.html
http://localhost/sitenews/sport/2005/02/26/
http://localhost/sitenews/sport/2005/02/
http://localhost/sitenews/sport/2005/
http://localhost/sitenews/sport/

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

вот интересно как другие делают...

   
 
 автор: glsv (Дизайнер)   (02.11.2005 в 10:05)   письмо автору
 
   для: Иван   (02.11.2005 в 04:38)
 

>вот интересно как другие делают...
Я бы, наверное, также сделал.

   
 
 автор: Иван   (02.11.2005 в 12:06)   письмо автору
 
   для: glsv (Дизайнер)   (02.11.2005 в 10:05)
 

вот можно ещё добавить ниже строчку для коментариев

RewriteRule ^[a-zA-Z]*/([a-zA-Z]*)?/?([0-9]{4})?/?([0-9]{1,2})?/?([0-9]{1,2})?/?commet_([0-9]*)?/?.html$ news_commet.php?category=$1&y=$2&m=$3&d=$4&nid=$5

http://localhost/sitenews/sport/2005/02/26/commet_120.html

вот только сижу сейчас голову ломаю, как сделать проверку и каждому параметру выдать свою страницу, допустим для параметра просмотреть новость за день должна выдоваться одна страница, а для просмотре за месяц другая, ну и так далее, а вот для просмотра за год можно было выводить календарь за 12 месяцем, причём так чтобы была проверка, чтобы никто другой немог ввести год неправельный, или месяц с днём, иначе выдать ошибочную страницу, так бы посмотреть как другие делают, а то чет неполучается

   
 
 автор: glsv (Дизайнер)   (03.11.2005 в 21:27)   письмо автору
 
   для: Иван   (02.11.2005 в 12:06)
 

Так а может быть Вам эту логику в php скрипте реализовать. Зачем Вам для этого mod_rewrite.
С помощью mod_rewrite вы уже сделали "красивые ссылки". Пусть теперь это все переадресуется на одну страницу, а уже на ней вы и проводите разбор: какие данные запрошены, какие блоки (страницы) нужно include-ить. Уникальности URL-а вы уже добились, а внутреннюю логику реализовывайте на PHP. Я бы так сделал.

   
 
 автор: V!rus   (04.11.2005 в 18:05)   письмо автору
 
   для: glsv (Дизайнер)   (03.11.2005 в 21:27)
 

Млин, задолбался я уже, ну не м огу сообразить )))
В общем, изначальные ссылки на сайте http://site.com/?price и http://site.com/?categoryID=1
Мне нужно, что бы при вызове http://site.com/1.html открывалась первая ссылка, а при вызове
http://site.com/category1.html вызывалась вторая ссылка
Если в .htaccess написать

RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteRule ^(.*).html$ index.php?$1

То первый случай работает, а втрой нет
Если написать

RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteRule ^(.*).html$ index.php?categoryID=$1

То работает второй случай
Вместе никак! Почему-то при первом случае(первом коде) http://site.com/categoryID=1.html не работает, хотя должно, ведь похожие ссылки (настоящяя http://site.com/?aux_page=aux1) работают (эту страницу можно вызвать http://site.com/aux_page=aux1.html)
Не могу понять!
PS еще не могу понять, почему при втором коде ссылка http://site.com/categoryID=1.html?offset=20 не работает

   
 
 автор: glsv (Дизайнер)   (04.11.2005 в 23:40)   письмо автору
 
   для: V!rus   (04.11.2005 в 18:05)
 

Что-то не ясно что во что преобразовывать.
Первоначально Вы писали

http://site.com/1.html
в 
http://site.com/index.php?1


http://site.com/category1.html
в 
http://site.com/?categoryID=1


А потом Вы описываете вот такие ссылки странного вида?

http://site.com/categoryID=1.html
http://site.com/categoryID=1.html?offset=20


?

   
 
 автор: V!rus   (05.11.2005 в 02:46)   письмо автору
 
   для: glsv (Дизайнер)   (04.11.2005 в 23:40)
 

Если не трогать .htaccess то ссылки такие:

http://site.com/index.php?что-то1
http://site.com/index.php?categoryID=что-то2
http://site.com/index.php?productID=что-то3
http://site.com/index.php?categoryID=что-то2&offset=что-то4
http://site.com/index.php?categoryID=что-то2&show_all=что-то5

Мне нужно что бы были такие

http://site.com/что-то1.html
http://site.com/category_что-то2.html
http://site.com/product_что-то3.html
http://site.com/category_что-то2_что-то4.html
http://site.com/category_что-то2__что-то5.html

   
 
 автор: glsv (Дизайнер)   (06.11.2005 в 22:30)   письмо автору
 
   для: V!rus   (05.11.2005 в 02:46)
 

Попробуйте вот так:

RewriteEngine on 
Options +FollowSymlinks 
RewriteBase / 
RewriteRule ^category_([^_]*)__([^_]*).html$ index.php?categoryID=$1&show_all=$2 [L]
RewriteRule ^category_([^_]*)_([^_]*).html$ index.php?categoryID=$1&offset=$2 [L]
RewriteRule ^category_(.*).html$ index.php?categoryID=$1 [L]
RewriteRule ^product_(.*).html$ index.php?productID=$1 [L]
RewriteRule ^(.*).html$ index.php?$1


PS:
Каждая инструкция RewriteRule, естественно, должна быть в одну строку.

   
 
 автор: V!rus   (10.11.2005 в 18:37)   письмо автору
 
   для: glsv (Дизайнер)   (06.11.2005 в 22:30)
 

Спасибо, счас проверю!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования