Для портирования под Internet Information Services в движке пришлось поменять до смешного немного. Более того, самый главный баг вообще бы не вылез, если бы я адаптировал транк, а не ветку 0.5.10/onr. Баг был связан с тем, что IIS, в отличие от apache и xitami, вешается при попытке повторного вызова cgi.FieldStorage() при POST-запросах. На других двух серверах просто возвращается пустая форма. В транке этот баг не вылез бы потому, что там я уже переделал всё ядро, и двойной вызов там убран.
Второй баг связан с тем, как IIS трактует переменную окружения PATH_INFO. Рассмотрим три сервера по порядку.
Под xitami все URL’ы выглядят так:
http://example.com/cgi-bin/sitename/?v=abc (GET) http://example.com/cgi-bin/sitename/index.py (POST)
Соответственно, PATH_INFO == "" (вполне логично).
На warmland.ru я использую mod_rewrite, и адреса переписываются так:
http://example.com/?v=abc -> http://example.com/cgi-bin/sitename/?v=abc (GET) http://example.com/index.py -> http://example.com/cgi-bin/sitename/index.py (POST)
И тут PATH_INFO == "".
IIS же считает, что все пути, по которым лежат сценарии, виртуальны.
http://example.com/?v=abc (GET) http://example.com/index.py (POST) http://example.com/dir/?v=abc (GET) http://example.com/dir/index.py (POST)
В первых двух примерах PATH_INFO == "index.py". Во вторых двух PATH_INFO == "dir/index.py". То есть IIS не только рассматривает путь как PATH_INFO, но и раскрывает directory default. Почему — неясно. Ясно только, что мои идеи использовать PATH_INFO накрылись медным тазом. Если я хочу поддерживать все три сервера, то надо быть очень конвенциональным — никаких рерайтов, никаких PATH_INFO.
← | Кондуктора вешать сюда | Грустная судьба «Моторолы» | → |