есть вполне приемлимые решения
404й обработчик под IIS вполне грамотно работает
----------вот кусок из ASP доки ---
Поскольку ни файлы, ни каталоги реально не существуют на сайте, IIS выдаст ошибку 404, которую нам и необходимо будет обработать.
В оснастке "Диспетчер служб Интернета" найдите созданный Вами виртуальный Web-узел и вызовите его "Свойства". На вкладке "Специальные ошибки" найдите ошибку HTTP 404. Измениете ее свойства на "Тип сообщения" - Адрес URL и в качестве адреса для страницы обработки введите относительный адрес /404.asp и нажмите OK. Теперь, при возникновении 404-ой ошибке IIS будет вызывать сценарий, хранящийся в 404.asp.
Важно помнить! Замена в "горячем режиме" будет осуществляться только для незарегистрированных расширений, то есть тех, которые не обрабатываются каким-либо ISAPI-приложением. Например файлы с расширением .asp обрабатываются asp.dll, а .shtm - приложением ssinc.dll и т.д. Поэтому для таких файлов будет осуществляться прямой редирект на страницу 404.asp. Чтобы этого не происходило см. например вот этот FAQ. Но поскольку в этом случае сценарий будет открываться дважды — один раз сервером и один раз обработчиком сценариев, — включение параметра "Проверка наличия файла" приведет к некоторому снижению производительности. Поэтому, в нашем примере мы и используем расширение .html (которое при настройках "по умолчанию" не обрабатывается ни одним из ISAPI-приложенем).
----
А вот кусок очень старого PHP кода который у меня в index.php под IIS занимается разбором УРЛа
PHP:
if (strstr($_SERVER['SERVER_SOFTWARE'],'IIS')) {
$cfg['serversoftware']='IIS';
if (preg_match('/^404;/',$_SERVER['QUERY_STRING'])) {
$cfg['fullurl'] = preg_replace('/^404;/','',$_SERVER['QUERY_STRING']);
$cfg['parseurl'] = parse_url($cfg['fullurl']);
$cfg['uri'] = preg_replace('/^404;http:\/\/'.$_SERVER['SERVER_NAME'].str_replace('/','\/',$cfg['rootdir']).'/','',$_SERVER['QUERY_STRING']);
$cfg['uri'] = preg_replace('/\?(.*)$/','',$cfg['uri']);
} else {
$cfg['fullurl'] = 'http://'.$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].'/';
$cfg['parseurl'] = parse_url($cfg['fullurl']);
$cfg['uri']='/';
}
$cfg['url'] = 'http://'.$cfg['parseurl']['host'].':'.$cfg['parseurl']['port'].$cfg['rootdir'].$cfg['uri'];
$cfg['fullurl'] = $cfg['url'].'?'.getenv('QUERY_STRING');
//разбираемся с _GET, _POST нормально передается ИТАК =)
foreach($_GET as $k=>$v) {
$cfg['varname'] = preg_replace('/^(.*)\?/','',$k);
$$cfg['varname']=$v;
}
-~{}~ 29.09.05 08:24:
сооветсвенно 404.asp меняем на index.php
получаем аналог апачевого
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !\.(css)|(js)|(gif)|(jpg)$
RewriteRule ^(.+) index.php?uri=$1&%{QUERY_STRING} [L]