Форум

/ домой \ \ темы /



Тема: PATH_INFO

20/09/2007 17:50 iZzz32:
Объясните, пожалуйста, поведение PATH_INFO:
127.0.0.1/cgi-bin/foo.pl/bar — PATH_INFO=/bar
127.0.0.1/cgi-bin/foo.pl/bar?baz=1 — PATH_INFO=/bar, QUERY_STRING = baz=1
но
127.0.0.1/cgi-bin/foo.pl/bar/ — PATH_INFO=/bar/foo.pl
127.0.0.1/cgi-bin/foo.pl/bar/?baz=1 — PATH_INFO=/bar/foo.pl, QUERY_STRING = oo.pl

И возможно ли избавиться от расширения в имени скрипта? Чтобы было просто "/cgi-bin/foo". Ведь я же прописываю shebang в первой строке скрипта (#!где-то/что-то -с -параметрами), почему бы это не использовать, если расширения у скрипта нет (сейчас ругается, мол, error running foo with "").
26/09/2007 13:55 iZzz32:
Max, вы бы хоть сказали, что прочитали это...
26/09/2007 16:55 Max:
PATH_INFO -- это "extra path information" экстра -- понятие растяжимое...
Используйте SCRIPT_NAME для имени скрипта
SCRIPT_FILENAME для полного имени файла
PATH_TRANSLATED для пути после имени файла

В случае отсутствия имени фала дефолтовому файлу QUERY_STRING не передается.

В Юниксах от расширения избавится можно, это поддержано на уровне систем или сшела. В Windows вы никак от него не избавитесь, сервер должен знать что и как запускать.
26/09/2007 17:19 iZzz32:
Спасибо за ответ.

Расширение: почему бы не сделать так: сервер видит файл без расширения с «идентификатором cgi» и НЕ знает, чем его запускать. Читает первую строку, если она начинается #!, запускает, чем написано, иначе ругается, как раньше, что не может запустить. А в «CGI-интерпретаторах» в настройках галочку «Использовать shebang, если интерпретатор неизвестен». Поддержка на уровне шелла тут ни при чём — запускает-то сервер!

PATH_INFO: так поддерживается ведь почти (очень был рад это узнать!). Если бы ещё имя скрипта (в примере с /bar/) не передавалось, было бы совсем здорово! PATH_TRANSLATED: не понял, при вызовах, как в первом сообщении, она у меня содержит точно то же самое, что и SCRIPT_FILENAME.

Теперь насчёт «QUERY_STRING не передается», «URL без имени файла с запросом не корректна», и «нет имени — нет запроса, это соответствует RFC».
RFC 2068 (3.2.1 General Syntax):
abs_path = "/" rel_path
rel_path = [ path ] [ ";" params ] [ "?" query ]
path = fsegment *( "/" segment )
fsegment = 1*pchar
segment = *pchar
params = param *( ";" param )
param = *( pchar | "/" )
Пример "/?foo=bar": компонент path необязательный, параметры не обязательны, запрос. Пример "/foo/?bar=baz": один fsegment в path, потом слэш, потом segment, который может состоять в том числе и из 0 pchar-ов, параметров нет, запрос. В чём моя ошибка?
Неужели так сложно пофиксить? Из-за этого кат в WordPress не работает, например, и очень многие другие скрипты тоже.
26/09/2007 22:53 AnrDaemon:
> В случае отсутствия имени фала дефолтовому файлу QUERY_STRING
> не передается

А можно узнать, почему? Ваш сервер первый на моей практике, кто это проделывает.

2 iZzz32: Поставьте Апач, не мучайтесь.
Не хочу ругать автора на его же форуме, но smallsrv a использую только ради DNS/DHCP сервера. (Причем DHCP работает только наполовину - адреса выдает, шлюзы и DNS нет)
Найду замену хотя бы DNS - убью SmallSrv не задумываясь.
27/09/2007 01:44 iZzz32:
AnrDaemon, Apache у меня тоже установлен, но Small HTTP Server ближе к [моему] идеалу маленького сервера для маленьких сайтов под Windows.
27/09/2007 03:00 AnrDaemon:
Когда у вас этих маленьких сайтов будет хотя бы десяток, да не только ваших - вам поневоле придется искать что-то более гибкое в настройке.
28/09/2007 14:36 iZzz32:
Cпецификация CGI/1.1: cgi-spec.golux.com/draft-coar-cgi-v11-00.txt
Спецификация CGI/1.2: cgi-spec.golux.com/cgi-120-00a.html
Обе спецификации весьма старинные, я на 1.1 буду ссылаться.

4.14. SCRIPT_NAME: «A URL path that could identify the CGI script» (см. мой вопрос про SCRIPT_NAME и виртуальные каталоги: www.smallsrv.com/forum/f.cgi?f=10417&a=1)

4.6. PATH_INFO: «A path to be interpreted by the CGI script. It identifies the source or sub-resource to be returned by the CGI script». Именно то, что мне требуется. Никакого имени скрипта туда подставлять не нужно.

9. Requirements for Servers: «Given this, any access to the partial URL "SCRIPT_NAME extra-path ? query-information" where extra-path is either NULL or begins with a "/" and satisfies any other server requirements, will cause the CGI script to be executed with PATH_INFO set to the decoded extra-path, and QUERY_STRING set to query-information (not decoded)». «extra-path» — это тот самый sub-resource, ничего растяжимого не вижу, понятие вполне определённое.

AnrDaemon, вряд ли такое случится, но если случится, это будет уже другая проблема, и решать я её буду по-другому — выделю под сайты компьютер с никсами и апачем. А пока у меня только полтора сайта, блог и вики, существующих настроек мне вполне хватает.
07/10/2007 17:08 iZzz32:
Max, ну хоть скажите, что ничего фиксить не будете!
07/10/2007 17:58 Max:
Смотрите версию 3.05.74 там кое-что пофиксено.
Кстати когда после имени скрипта был /path/ этот /path/ и раньше клался в PATH_INFO

08/10/2007 00:18 iZzz32:
Small HTTP Server ver. 3.05.74test5

PATH_INFO:
Виртуальный хост xyzzy указывает на Y:\Projects\xyzzy\cgi, в нём cgi-bin, в нём foo.pl, выводящий переменные окружения.

xyzzy/cgi-bin/foo.pl/bar?baz
(OK) SCRIPT_NAME = /cgi-bin/foo.pl
(OK) PATH_INFO = /bar
(OK) QUERY_STRING = baz

xyzzy/cgi-bin/foo.pl/bar/?baz
(OK) SCRIPT_NAME = /cgi-bin/foo.pl
(__) PATH_INFO = /bar/foo.pl — откуда тут foo.pl?!
(OK) QUERY_STRING = baz


SCRIPT_NAME:
Виртуальный каталог /plugh/ указывает на Y:\Projects\fwiki\cgi\cgi-bin, в нём foo.pl, выводящий переменные окружения.

127.0.0.1/plugh/foo.pl
(__) SCRIPT_NAME = /foo.pl — должно быть /plugh/foo.pl


QUERY_STRING: работает! огромное вам спасибо!
09/10/2007 06:37 Max:
У вас видимо файл по умолчанию задан foo.pl ?

09/10/2007 10:49 iZzz32:
Нет, по умолчанию index.*
09/10/2007 13:18 iZzz32:
PATH_INFO: то есть, если URL вроде somewhere/cgi-bin/script.pl/path/ заканчивается слешем, в конец PATH_INFO добавляется имя скрипта (а файл по умолчанию тут ни при чём). И ещё такое поведение: cлучайно попал скрипт test.pl в корень сайта (без cgi-идентификаторов в пути, атрибут SYSTEM тоже не стоит). Прошу 127.0.0.1/test.pl — отдаёт содержимое test.pl, прошу 127.0.0.1/test.pl/foo — ТОЖЕ отдаёт содержимое test.pl. Мне это не мешает, но всё же во втором случае правильнее, наверное, 404 возвращать?

SCIPT_NAME: если скрипт в виртуальном каталоге, в SCRIPT_NAME кладётся путь относительно виртуального каталога, а не корня сайта.
10/10/2007 04:32 Max:
Ну с test.pl то все правильно, -- раз он не исполняемый значит отдается.

смотрите обновленную модификацию версии 3.05.74
10/10/2007 13:00 iZzz32:
Small HTTP Server ver. 3.05.74

> Ну с test.pl то все правильно, -- раз он не исполняемый значит отдается.
Раз не исполняемый, значит обычный. Почему же 127.0.0.1/index.html/x "400" генерирует, а 127.0.0.1/test.pl/x "200 Ok"?

SCRIPT_NAME, PATH_INFO: подтверждаю.

Пользователь: Пароль: Новый пользователь:   Запомнить пароль: