PHP и с чем его едят....

Wodan

Всем клева!
Необходимо реализовать вызов личной страницы следующим способом:
, nickname - имя пользователя, но папки nickname на сервере не существует.

Можно ли перенаправлять подобные вызовы в, например, index.php с передачей nickname в виде пераметра?
 

GrAndSE

Тёмный
Модератор
Необходимо реализовать вызов личной страницы следующим способом:
, nickname - имя пользователя, но папки nickname на сервере не существует.

Можно ли перенаправлять подобные вызовы в, например, index.php с передачей nickname в виде пераметра?
Традиционный способ дописывать правила преобразования url в .htaccess, используя как сказал ruslan mod_rewrite. Например, для работы с wordpress обічно используют такой набор правил для mod_rewrite:
Код:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Эта "штука" перенаправляет все запросы на index.php. Далее сам wordpress занимается разбором полученых данных. Ну а используя суперглобальный массив $_SERVER можно получить то, что написано в строке браузера. Например, я использовал $_SERVER['SCRIPT_NAME'], $_SERVER['HTTP_HOST'], $_SERVER['REQUEST_URI'] чтобы получить полную строку, убрать из неё лишние элементы и т.д.
В таком подходе есть подводный камень в виде необходимости указывать полный путь к css изображениям в тегах img и т.д. Т.е. нельзя делать нечто <img src="./images/logo.png" />, а нужно
Код:
<img src="http://myhost.com/images/logo.png" /> и <link type="text/css" rel="stylesheet" href="http://myhost.com/css/style.css" media="screen" />
Хотя в самих файлах css такое делать можно но не нужно. (там уже путь берётся относительно разположения файла со стилями, а не относительно адреса в строке браузера).

Также можно сильнее нагрузить сам mod_rewrite написать побольше сложных правил в .htaccess, но мне больше по душе пришёлся приведённый мной метод.
 

Dre.hz

Active Member
В таком подходе есть подводный камень в виде необходимости указывать полный путь к css изображениям в тегах img и т.д. Т.е. нельзя делать нечто <img src="./images/logo.png" />, а нужно
Код:
<img src="http://myhost.com/images/logo.png" /> и <link type="text/css" rel="stylesheet" href="http://myhost.com/css/style.css" media="screen" />
Это бред. Какое отношение имеет HTML код и его интерпретация браузером к обработке HTTP запросов апачем?
 

dreamer

Member
Это бред. Какое отношение имеет HTML код и его интерпретация браузером к обработке HTTP запросов апачем?
В принципе, при использовании mod_rewrite'а в первый раз действительно возникают некоторые проблемы с путями внутри HTML-документа. Проблема в том, что один документ может быть доступен по некоторым адресам, что заставляет использовать полный путь или тег base.
 

GrAndSE

Тёмный
Модератор
Это бред. Какое отношение имеет HTML код и его интерпретация браузером к обработке HTTP запросов апачем?
Браузер будет производить обращение к северу подразумевая, что файлы находятся в поддиректории, и сервер честно вернёт то, что его просили... Скорее всего 404. И что я бредового сказал по поводу интерпретации HTML и обработке запросов веб-сервером, будь то apache, nginx, lighttpd или что-нибудь ещё?

Что до "нормальных правил", то в большинстве случаев проще указать абсолютный путь. Например, если есть поддиректория с изображениями, а также поддиректория files, в которой можут быть и изображения и ещё масса всякого хлама, а есть ещё куча поддиректорий с разным безобразием. Приведённый мной пример с легкостью переносится и на nginx и на lighttpd - по сути написать две строчки, только пути к файлам нужно генерировать с учетом абсолютного пути. При использовании нормальных инструментов с такими вещами не возникает проблем. А вот с правилами посложнее и мороки побольше. Хотя кому-то может быть проще переписать файл правил, чем указать абсолютные пути, даже используя функции какого-либо framework. Мне лично удобней именно, как я написал.
 

Dre.hz

Active Member
Браузер будет производить обращение к северу подразумевая, что файлы находятся в поддиректории, и сервер честно вернёт то, что его просили... Скорее всего 404. И что я бредового сказал по поводу интерпретации HTML и обработке запросов веб-сервером, будь то apache, nginx, lighttpd или что-нибудь ещё?
Бредово сопоставлять эти категории на одном уровне. (Как узнать в пхп скрипте разрешение экрана пользователя? - это из той же серии). Как бы ты не записал адрес картинки (1), браузер будет ее запрашивать так, как это огворено в спецификации HTTP-протокола (2). Переход от (1) к (2) - это то,что я назвал интерпретацией HTML браузером. В ответ на запрос сервер уже своими механизмам будет разбираться - что надо отдать пользователю.

Лабораторный опыт. Имеем файл :
HTML:
<html>
<body>
<img src="http://noty.net/files/blogfiles/esperanto.gif" />
<img src="/files/banner1.jpg" />
<img src="files/banner2.jpg" />
<body>
</html>
В нем мы тремя разными способами указываем путь к картинке. Затем откроем этот файл в браузере, и в процессе открытия посмотрим что происходит на уровне HTTP-запросов (с помощью прокси-сервера). Что нам говорит дамп http-хедеров:
Код:
+++GET 1+++
GET [B][COLOR="#0000ff"]/yo.html[/COLOR][/B] HTTP/1.0
User-Agent: Opera/9.60 (Windows NT 5.1; U; en) Presto/2.1.1
Host: [B][COLOR="#0000ff"]markusweb.com[/COLOR][/B]
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Cookie: __qca=458e6c7b-65edb-11e84-2bf48; __gads=ID=1b5a5a0c8f6fd468:T=1196554487:S=ALNI_MYPqxn8KbzMWY9G7QxbgPfOYJ9C2A; WT_FPC=id=193.110.17.202-4023436720.29807055:lv=1196755687421:ss=1196755667171; dbx-postmeta=grabit:0+|1+|2+|3+|4+|5+&advancedstuff:0+|1-|2-; __utmz=266254995.1211866067.22.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none); CP=*; POPUPCHECK=1211954817679; __utma=266254995.445519409.1195381108.1211896657.1211910756.25; Move_UUID=391241abc37d4caca00be2f9bf649faf
Cookie2: $Version=1
Pragma: no-cache
Cache-Control: no-cache
Connection: keep-alive
Browser reload detected...

...

+++GET 2+++
GET [B][COLOR="#0000ff"]/files/blogfiles/esperanto.gif[/COLOR][/B] HTTP/1.0
User-Agent: Opera/9.60 (Windows NT 5.1; U; en) Presto/2.1.1
Host: [B][COLOR="#0000ff"]noty.net[/COLOR][/B]
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Referer: http://markusweb.com/yo.html
If-Modified-Since: Wed, 03 Sep 2008 17:46:21 GMT
If-None-Match: "56c89b-2644-6a0c7540"
Cookie: vietsharing_id=xj01823j8443; CP=null*; __utma=17224998.1044931856.1169154524.1175080111.1175150646.10; LastV1=2007-04-14; LastV2=2007-11-17; name=--
Cookie2: $Version=1
Connection: keep-alive

+++GET 3+++
GET [B][COLOR="#0000ff"]/files/banner1.jpg[/COLOR][/B] HTTP/1.0
User-Agent: Opera/9.60 (Windows NT 5.1; U; en) Presto/2.1.1
Host: [B][COLOR="#0000ff"]markusweb.com[/COLOR][/B]
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Referer: http://markusweb.com/yo.html
If-Modified-Since: Thu, 28 Feb 2008 08:56:50 GMT
If-None-Match: "1c8004-66ea-1a2ef880"
Cookie: __qca=458e6c7b-65edb-11e84-2bf48; __gads=ID=1b5a5a0c8f6fd468:T=1196554487:S=ALNI_MYPqxn8KbzMWY9G7QxbgPfOYJ9C2A; WT_FPC=id=193.110.17.202-4023436720.29807055:lv=1196755687421:ss=1196755667171; dbx-postmeta=grabit:0+|1+|2+|3+|4+|5+&advancedstuff:0+|1-|2-; __utmz=266254995.1211866067.22.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none); CP=*; POPUPCHECK=1211954817679; __utma=266254995.445519409.1195381108.1211896657.1211910756.25; Move_UUID=391241abc37d4caca00be2f9bf649faf
Cookie2: $Version=1
Connection: keep-alive

+++GET 4+++
GET [B][COLOR="#0000ff"]/files/banner2.jpg[/COLOR][/B] HTTP/1.0
User-Agent: Opera/9.60 (Windows NT 5.1; U; en) Presto/2.1.1
Host: [B][COLOR="#0000ff"]markusweb.com[/COLOR][/B]
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Referer: http://markusweb.com/yo.html
If-Modified-Since: Thu, 28 Feb 2008 08:56:50 GMT
If-None-Match: "1c8005-a460-1a2ef880"
Cookie: __qca=458e6c7b-65edb-11e84-2bf48; __gads=ID=1b5a5a0c8f6fd468:T=1196554487:S=ALNI_MYPqxn8KbzMWY9G7QxbgPfOYJ9C2A; WT_FPC=id=193.110.17.202-4023436720.29807055:lv=1196755687421:ss=1196755667171; dbx-postmeta=grabit:0+|1+|2+|3+|4+|5+&advancedstuff:0+|1-|2-; __utmz=266254995.1211866067.22.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none); CP=*; POPUPCHECK=1211954817679; __utma=266254995.445519409.1195381108.1211896657.1211910756.25; Move_UUID=391241abc37d4caca00be2f9bf649faf
Cookie2: $Version=1
Connection: keep-alive
Я подсветил синим цветом то, на что надо обратить внимание. Идет обращение к серверу, указывается [виртуальный] хост и путь к файлу. Во всех четырех случаях (включая запрос самогог файла yo.html) - одинаково. Заметьте - до mod_rewrite дело еще не дошло. Это только та информация, которую шлет браузер серверу. Ее достаточно чтобы получить ответ. И браузеру не надо ничего "подразумевать" и прочими способами проявлять интеллект.

Поэтому нельзя говорить, что использование mod_rewrite заставит по-другому оформлять аттрибут src тэгов.
 
Зверху