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

Форум Регулярные Выражения

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

 

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

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

тема: Вид ссылок
 
 автор: *m*   (25.08.2009 в 17:50)   письмо автору
 
 

Доброго времени суток!)

Мне нужно ссылку вида script.php?a=5 с помощью .htaccess'a и рег выражений представить в виде article/10985.html например..
тоесть чтобы слово script менялось на article, переменная а со своим значение м менялась бы на какоенибудь число и добавлялось расширение html

приведите кому не сложно код, оч надо..

спасибо)

  Ответить  
 
 автор: heed   (25.08.2009 в 21:00)   письмо автору
 
   для: *m*   (25.08.2009 в 17:50)
 

В форуме Apache полно тем в которых есть примеры по mod_rewrite,
в поиск заходить не стал , вот нашёл на первой-же странице, почти то что нужно
http://softtime.ru/forum/read.php?id_forum=5&id_theme=66024&page=1
чем отличаются такие [0-9] надписи от таких [a-z] думаю разберётесь

  Ответить  
 
 автор: *m*   (25.08.2009 в 23:58)   письмо автору
 
   для: heed   (25.08.2009 в 21:00)
 

к сожалению, не то. .
я юзал поиск, там тоже под определенные вопросы инструкции даны.

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

мне нужно
1. чтобы ссылки вида index.php принимали вид index.html

2. ссылки вида
script.php?id=3 в итоге выглядело бы как script/10685.html и
port.php?id=7 в итоге выглядело бы как port/11867.html
т.е все что идет после знака вопроса, преобразовывалось в число и в конце добавлялось .html

3. ссылки вида post?a=1 преобразовывались бы в post/all_article

  Ответить  
 
 автор: heed   (26.08.2009 в 04:44)   письмо автору
 
   для: *m*   (25.08.2009 в 23:58)
 

Если чесно, тут не сколько рег выражения
, сколько нужно знать сайт изнутри на котором нужно (даже 99% что не нужно)
создавать такой .htaccess как с Ваших слов
Options +FollowSymlinks

RewriteEngine On
RewriteBase /

RewriteRule ^index\.html$ index.php [L,QSA]
RewriteRule ^port/([0-9]+)\.html$ port.php?id=$1 [L,QSA]
RewriteRule ^post/all_article/?$ post?a=1 [L,QSA]
RewriteRule ^script/([0-9]+)\.html$ script.php?id=$1 [QSA]

Может оказаться что зайдя по адресу /script/10685.html получат страницу совсем без стилей картинок и скриптов, потомучто там везде относительные пути.
Или кто-то захочет увидеть что-же лежит в этой папке и наберёт просто /script/, и узнает что даже несуществует такой дирректории.
или много ещё чего может быть.

Лично я не делаю у себя ничего такого кроме нескольких в разных местах что-то вроде
RewriteRule ^(.*\.html)$ ?$1
правил, чтобы просматривая на localhost подсветить код наприменр и при этом ссылки, как при простом открытии кликом по файлу, действовали.
Но если создаю чего-нибудь, заранее предусматривю возможность подделки адресов, чтобы в случае чего не пришлось перетряхивать всё это полностью, что возможно Вам и придётся делать

  Ответить  
 
 автор: *m*   (26.08.2009 в 09:57)   письмо автору
 
   для: heed   (26.08.2009 в 04:44)
 

Не работает.. Я добавил инструкции в .htacces , ровным счетом ничего не происходит ссылки как были так и остаются..


>Может оказаться что зайдя по адресу /script/10685.html получат страницу совсем без стилей картинок и скриптов, потомучто там везде относительные пути.
Или кто-то захочет увидеть что-же лежит в этой папке и наберёт просто /script/, и узнает что даже несуществует такой дирректории.
или много ещё чего может быть.


А разве для интерпритатора не остаются действительными начальные ссылки?
Насколько я понял, все эти подделанные ссылки пооделываются всеголишь в начале загрузки страницы, и для пользователя принимают вид заданный инструкциями в .htaccess
а сама страница то работает с учетом первичных ссылок.. или я не правильно понял.. (спасибо за разьяснения и помощь, я впервые сталкиваюсь с подобным вопросом.)

  Ответить  
 
 автор: heed   (26.08.2009 в 12:09)   письмо автору
 
   для: *m*   (26.08.2009 в 09:57)
 

> ничего не происходит

или вы не в корне сайта положили .htaccess
или в httpd.conf для дирректории в которой лежит сайт так установлена дирректива
AllowOverride None
можно задать например ей другое значение так AllowOverride All
или не реагирует потомучто не был запрошен совпавший URI , например такой
/script/1.html
(если чесно, по вашему вопросу так и не понял является-ли целью обработка адресов похожих на статичные, или наоборот на запросы с разными параметрами должны открываться просто статичные html-файлы, выбирал первое ,) как более частый вариант)

> остаются действительными начальные ссылки

если они не попадут под одно из правил которые будут переправерены все ещё раз , после того как запросится уже изменённый адрес (флаг [L] никак не повлияет на то что всё повторно перепроверится, влияет лишь на то что при прервой проверке нижележащие относительно совпавшего правила будут пропущены)

>для пользователя принимают вид заданный инструкциями в .htaccess

для пользователя , вернее клиента т.е. браузера важна только адресная строка
, по которой он получил документ. Чтобы адресная строка изменилась придётся перенаправлять(редиректить) клиента на изменённый адрес, и получится два запроса клиента , вместо одного. чтобы такое сделать достаточно просто добавить флаг [R] к остальным.
(получится например [QSA,L,R] ? но тогда пропадает весь смысл ЧеловекоПонимаемыхУРЛ)

// я-бы посоветовал чего-нибудь поискать из того что можно почитать обо всём связанным с mod_rewrite, ато на словах могу ичего-нибудь поперепутать, или совсем не знать ;)

  Ответить  
 
 автор: *m*   (26.08.2009 в 15:04)   письмо автору
 
   для: heed   (26.08.2009 в 12:09)
 

файл .htaccess лежит в корне.

httpd.conf -

<Directory />
    Options Includes Indexes FollowSymLinks
    AllowOverride All
    Order deny,allow
    Allow from all
    Satisfy all
</Directory>


запрошена была правильная ссылка я собственно для тестирования специально ее и нажимал.. А не работает даже банально index.php в index.html не переходит..

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

))) мне как раз нужно второе)

- запросы с разными параметрами должны открываться просто статичные html-файлы

>для пользователя , вернее клиента т.е. браузера важна только адресная строка
, по которой он получил документ. Чтобы адресная строка изменилась придётся перенаправлять(редиректить) клиента на изменённый адрес, и получится два запроса клиента , вместо одного. чтобы такое сделать достаточно просто добавить флаг [R] к остальным.
(получится например [QSA,L,R] ? но тогда пропадает весь смысл ЧеловекоПонимаемыхУРЛ)

а меня как раз ЧПУ не интересует мне просто нужно скрыть различные передаваемые параметры..
Кстати получается, довольно мощная нагрузка на сервер, так ведь? Сначала приведи клиента по одному пути, потом перенаправь на другой, собственно двойная нагрузка..

  Ответить  
 
 автор: heed   (26.08.2009 в 19:36)   письмо автору
 
   для: *m*   (26.08.2009 в 15:04)
 

Нее, так уже на моей памяти ещё никто не пинал клиентов вместе с пользователями ;)
тут думаешь пнуть или не пнуть всех разок при заходе куда-нибудь чтобы проверить включены-ли cookie, и выбираешь что лучше пинать когда уже точно не включены
,) а тут такое
насчёт нагрузки на сервер незнаю насколько но трафик точно увеличится
как и всяких Rule и Cond
это с Ваших слов получается что не считая верхних строк будет что-то такое
RewriteCond %{QUERY_STRING} ^id=([0-9]+)
RewriteRule ^(port|script)\.php$ $1%1.html  [R,L] 

RewriteCond %{QUERY_STRING} ^a=1
RewriteRule ^post/?$ post/all_article  [R,L] 

RewriteRule ^index\.php$ index.html [R,QSA]
#непроверял но думаю легко найдётся
# в уже почитаной полезной литературе , как чего-нибудь поправить 
не считая что я не понял слов "на какое-то число", и примерно изобразил как будет если число как-раз такое которое передали в get-параметре.
А лучше одуматься , пока не поздно

  Ответить  
 
 автор: *m*   (28.08.2009 в 19:59)   письмо автору
 
   для: heed   (26.08.2009 в 19:36)
 

правильно поняли, какоето число это параметр передаваемый гетом.

только вот не работает почему то..((

срабатывает меняет допустим на index.html но ошибка и пишет что не найден данный файл на сервере..

The requested URL /index.html was not found on this server.

почему не работает то..
я уже почитал впринципе о mod_rewrite тут http://htaccess.net.ru/doc/mod_rewrite/RewriteRule.php

только вот разобраться не могу почему не работает..

  Ответить  
 
 автор: heed   (28.08.2009 в 20:45)   письмо автору
 
   для: *m*   (28.08.2009 в 19:59)
 

похоже потомучто по всей видимости нету файла index.html в корне сайта :)
но если запрашивали index.php , то значит всё работает :)
если имелся ввиду index.html в другой дирректории , можно попробовать переопределить диррективу RewriteBase непосредственно перед тем правилом
, которое заменяет index.php на index.html например установить /other_dirredctory/ (если так называется)
,но если чесно , так я тоже не пробовал ещё делать ,) в случае чего придётся делать ещё один .htaccess

  Ответить  
 
 автор: *m*   (29.08.2009 в 01:01)   письмо автору
 
   для: heed   (28.08.2009 в 20:45)
 

index лежит в корне, так как быть то..? тоесть получаеться работают инструкции, но нужно то чтобы работало вместе с инструкциями..)
второй .htaccess здесь что вы имеете ввиду?

  Ответить  
 
 автор: heed   (29.08.2009 в 13:05)   письмо автору
 
   для: *m*   (29.08.2009 в 01:01)
 

>имеете ввиду
забудьте,) я опять неправильно понял

>чтобы работало вместе с инструкциями
имеете ввиду нужно чтобы если указана такая дирректива , а на самом деле такого файла index.html не имеется, то не должно работать, т.е. должно работать подругому ?

тогда лучше совсем не делать такое правило

или может у Вас там не index.html , а тоже-самое только с большой буквы, или американскими буквами , вместо английских? тогда удалите совсем этот index.html, и создайте новый

  Ответить  
 
 автор: *m*   (29.08.2009 в 14:06)   письмо автору
 
   для: heed   (29.08.2009 в 13:05)
 

так. давайте по порядку, еще раз заново объясню:

нужно чтобы происходила как-бы подстановка, вместо одного вида ссылок другой вид ссылок.
НО для этого наличие файлов на сервере то не требуется, тоесть на сервере физически существует index.php нужно чтобы при загрузке страницы и обработке ее происходила подмена index.php на index.html в адресной строке (и все ссылки в документе index.php принимали вид index.html), но приэтом выполнялась работа index.php файла.

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

  Ответить  
 
 автор: heed   (29.08.2009 в 14:28)   письмо автору
 
   для: *m*   (29.08.2009 в 14:06)
 

так то-жеж было в самом первом примерном htaccess , который я набросал :)
и без всяких редирестов,
но если Ваши скрипты так и генерируют динамические ссылки
, типа ?id=1 , то тут ничего и не поделать.
Если редирестить на статическую при нажатии на динамическую ссылку , а затем уже делать внутренний редирект снова на ту-же самую динамическую ссылку , то какой вообще смысл всего этого ,) я не понимаю. Всёравно неглупые пользователи заметят , что при наведении мышки-то ссылка динамическая, а ещё такие недоверчивые как я и спрашивать при перенаправлениях могут включить.

  Ответить  
 
 автор: *m*   (29.08.2009 в 15:02)   письмо автору
 
   для: heed   (29.08.2009 в 14:28)
 

ну все... вот теперь я оканчательно запутался..)
как бы то мне?? как мне из динамических ссылок сделать статичные?

в первом варианте который вы написали не работает замена index.php на index.html

  Ответить  
 
 автор: heed   (29.08.2009 в 17:20)   письмо автору
 
   для: *m*   (29.08.2009 в 15:02)
 

> из динамических ссылок сделать статичные
сделать где??)

> index.php на index.html
так и не должно работать ,) там просто сделано так
, что при запросе URI /index.html , будет отдан /index.php ,
или результат того что с ним сделает обработчик.
И без разницы что там конкретно в html
, mod_rewrite ничего не заменяет, просто он реагирует на запрашиваемые адреса, анализируя их и даже иногда другие факты , и выполняется предписанное .

Конечно можно напрячь обработчик , например mod_php , тем чтобы он буферизовал выводимое, и отдавал только после замены там всех таких ссылок, но проще сделать чтобы ссылки сразу формировались такими какими нужны
, и менее затратно.

// сразу отказываюсь показывать примерно как это будет с буферизацией
, поскольку постолько над сервером нельзя так издеваться , только чтобы у браузеров были красивые ссылки )

  Ответить  
 
 автор: *m*   (31.08.2009 в 23:50)   письмо автору
 
   для: heed   (29.08.2009 в 17:20)
 

я понял.. хорошо, ну а как тогда мне сделать? как правильно...?
тоесть смотрите, вот у меня данные например хранятья в БД. в БД есть поле id оно автоинкремент. Есть файл например article.php который выводит данные из БД.
тоесть ссылка вывода всех записей будет выглядеть так: somesite.com/article.php?cat=1, например. А ссылки отображения конкретной записи будут выглядеть: somesite.com/article.php?id=1 /// 2,3,4 5 и.т.д соответсвенно.. Так вот, на стадии проектирования так сказать, как мне нужно сделать, чтобы в итоге у меня получились статичные ссылки???
Тоесть чтобы страница загружалась для пользователя сразу с уже статичными ссылками??

  Ответить  
 
 автор: heed   (01.09.2009 в 19:06)   письмо автору
 
   для: *m*   (31.08.2009 в 23:50)
 

можно было-бы сказать , что так и нужно сразу выводить "/1.html", вместо "/?id=1"
, но очень может быть что не везде из тех мест, куда попадёт этот скрипт будет использован mod_rewrite
, даже возможно не будет и apache.

Можно только просто сделать в том , из чего берутся настройки конфигурации , такой флаг, используются настоящие ссылки , или используются ссылки , которые разбираются mod_rewrite
, и взависимости от состояния этого флага скрипт должен генерировать один из двух возможных вариантов ссылок.
Дополнительные возможности требуют дополнительных действий,
в том-числе и проверки активировано-ли использование этих возможностей

  Ответить  
 
 автор: *m*   (03.09.2009 в 23:08)   письмо автору
 
   для: heed   (01.09.2009 в 19:06)
 

спасибо за помощь в принципе я окончательно разобрался все заработало..

только вот какой вопрос остался, смотрите, вы приводили мне примеры, когда гетом передавалась одна переменная..например:
domen.ru/warez.php?id=1 

делаю так:
RewriteRule ^warez/([0-9]+)$ warez.php?id=$1 [L,QSA]

все ок. А если две переменных:
domen.ru/warez.php?id=1&dom=3 

то по идее вот так:
RewriteRule ^warez/(.*)$ warez.php?id=$1&dom=$2 [L,QSA]

но в этом случае, если после слеша остаются только цифры то они как бы плюсуются чтоли, например, резулятом последнего стала ссылка вида:
warez/13

и запрос пытаеться достать из базы запись с индексом (id) 13, хотя на самом деле это id 1.
а например так:
warez/1&3
- работает.. А как сделать так чтобы работало в таком варианте:
warez/13
????

  Ответить  
 
 автор: heed   (04.09.2009 в 09:37)   письмо автору
 
   для: *m*   (03.09.2009 в 23:08)
 

^warez/([0-9])([0-9]+)/?$
но в $1 всегда будет только одна цифра
и совпадает только если не менее двух цифр

  Ответить  
 
 автор: *m*   (04.09.2009 в 11:36)   письмо автору
 
   для: heed   (04.09.2009 в 09:37)
 

а если id со временем вырастет до ста например? или до 10? то в $1 уже будет две цифры или три, то это будет:

^warez/([0-9]+)([0-9]+)$
?? тоесть либо одно либо более число вхождений.
и получаеться тогда в строку браузера можно прописать еще сколько угодно цифр, не будет ли это опасно?

  Ответить  
 
 автор: heed (. .)   (04.09.2009 в 12:06)
 
   для: *m*   (04.09.2009 в 11:36)
 

Тогда лучше.бы изменить формат ссылки разделив числа, например символом "_"
(некоторые символы лучше не использовать)
получится
^warez/([0-9 ]+)_([0-9 ]+)/?$
, но если в первом случае достаточно было сделать ([0-9 ]*) или ([0-9 ]?) в какой-нибудь из подмасок
, чтобы допустить возможность передачи только одного параметра.
То здесь всё усложнится
Например так
^warez/([0-9 ]+)_?([0-9 ]*)/?$
чтобы обязательным былао только одно число

  Ответить  
 
 автор: *m*   (04.09.2009 в 13:03)   письмо автору
 
   для: heed (. .)   (04.09.2009 в 12:06)
 

а если так оставить:
^warez/([0-9 ]+)([0-9 ]+)$
какая будет разница с этим:
^warez/([0-9 ]+)_([0-9 ]*)$
?? кроме подчеркивания и вхождений во второй паатерн ? и кастати обратите еще внимание я умышленно убрал знаки вопроса, такой вариант будет правельным?

  Ответить  
 
 автор: heed _   (04.09.2009 в 12:24)
 
   для: *m*   (04.09.2009 в 11:36)
 

Сколько угодно цифр не получится ,) 4 килобайта вроде максимум , что могут схавать некоторые серверы
, но Вам виднее .)
Можно попробовать использовать вместо квантификаторов +и* такие {1,4}и{0,4}

  Ответить  
 
 автор: *m*   (04.09.2009 в 13:04)   письмо автору
 
   для: heed _   (04.09.2009 в 12:24)
 

слушайте точно про фигурные скобки то я не вспомнил и не подумал..)

  Ответить  
Rambler's Top100
вверх

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