Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Администрирование Web серверов и Web служб > Скрипт исполняется 2 раза


Автор: Chuck 25.8.2005, 15:35
Привет всем!
У меня возникла такая проблема.
Есть скрипт, есть .htaccess файлик
Код

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)[/]?([^/]*)?[/]?([^/]*)?[/]?$ /index.php?part=$1&p1=$2&p2=$3&%{QUERY_STRING}

Все бы хорошо, да заметил я, что скрипт исполняется 2 раза, т.е. первый раз он исполняется, но результат работы куда то девается (надеюсь в /dev/null), ну а второй раз уже отдается в браузер!

Как избежать 1 запуска?

Автор: Mal Hack 25.8.2005, 15:54
Запускаешь на локальном сервере через браузер?
Какой показатель показывает, что идет два раза выполнение?

Автор: Chuck 25.8.2005, 16:06
Запускаю на сервере http://chuck.freemail.uz/
Показатели: в базе поле хитов увеличивается не на 1, а на 2!
Так же в конце скрипта вставил такой вот код
Код

$f = fopen("counter.txt", "a");
fwrite($f, $_SERVER['REMOTE_ADDR']."\n");
fclose($f);

Результаты тут http://chuck.freemail.uz/counter.txt
Как видите, заходя 1 раз, ваш IP записывается 2 раза!

Автор: Mal Hack 25.8.2005, 16:11
Поставь в конце правила [L]

Автор: Chuck 25.8.2005, 16:34
Поставил, результат тот же!

Автор: Mal Hack 25.8.2005, 16:37
Так, а если в index.php оставить ТОЛЬКО код записи в файл, и проверить, результат - тот же?
Полностью .htaccess приведи.

Автор: Chuck 25.8.2005, 20:35
вот скрипт
Код

<?
$f = fopen("counter.txt", "a");
fwrite($f, time()." - ".$_SERVER['REMOTE_ADDR']."\n");
fclose($f);
?>


Вот файл .htaccess
Код

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)[/]?([^/]*)?[/]?([^/]*)?[/]?$ index.php?part=$1&p1=$2&p2=$3&%{QUERY_STRING}[L]


Может забить на этот RewriteRule и парсить $_SERVER["REQUEST_URI"]?

Автор: Irokez 25.8.2005, 20:37
имхо - не поможет ничего, это так mod_rewrite работает..

Автор: Mal Hack 25.8.2005, 20:45
Цитата(Irokez @ 25.8.2005, 21:37)
имхо - не поможет ничего, это так mod_rewrite работает..

Это почему?

Цитата(Chuck @ 25.8.2005, 21:35)
Может забить на этот RewriteRule и парсить $_SERVER["REQUEST_URI"]?

Ну это конечно было бы лучше
RewriteRule ^.*$ index.php [L.QSA]

Автор: Irokez 25.8.2005, 20:50
Цитата(Mal @ 25.8.2005, 20:45)
Это почему?

потому что у меня была такая же проблема, решил только через запоминание времени в сессии..

Автор: Mal Hack 25.8.2005, 20:54
Цитата(Irokez @ 25.8.2005, 21:50)
потому что у меня была такая же проблема, решил только через запоминание времени в сессии..

Не, ты объясни почему реврайт так работает?
Этого не может быть. Значит где-то есть логическая ошибка ;)

Автор: Irokez 25.8.2005, 21:01
Цитата(Mal @ 25.8.2005, 20:54)
Не, ты объясни почему реврайт так работает?

mod_rewrite - модуль для обработки запросов, при переделывании запроса (RewriteRule) мод реврайт получает один запрос, составляет второй и отправляет результат его выполнения браузеру, но при этом то первый запрос он тоже выполняет (?), но просто браузеру он не передает.. хотя логичнее предположить что первый запрос никуда не отправляется, но тогда как может модуль узнать что
Код

RewriteCond %{REQUEST_FILENAME} !-d

если сервер не выполняет первый запрос... тогда и получается:
выполняется первый запрос, получаются все данные (является ли запращиваемый ресурс файлом, директорией, линком итп), переделывается согласно правилу и результат отправляется обратно браузеру..
таковы мои рассуждения, возможно я неправ.. чтобы разобраться надо в очередной раз прочитать мануал по мод_реврайту..

Автор: Mal Hack 25.8.2005, 21:11
Цитата(Irokez @ 25.8.2005, 22:01)
но при этом то первый запрос он тоже выполняет

не может такого быть, т.к. тогда бы mod_rewrite'ом никто не пользовался, ну сам подумай.

Автор: Irokez 25.8.2005, 21:23
Цитата(Mal @ 25.8.2005, 21:11)
не может такого быть, т.к. тогда бы mod_rewrite'ом никто не пользовался, ну сам подумай.

да вот думаю... просто практика показывает обратное... возможно запрос идет "неполный" smile но достаточный чтобы скрипт выполнился... глупо звучит конечно

Автор: Chuck 26.8.2005, 11:54
Цитата
и отправляет результат его выполнения браузеру

Нифига он браузеру не может отрпавлять, глупость!
mod_rewrite подобен процедуре, которая перехватывает у apache URI, переделывает его по правилам и, тут самое интересное, посылает запрос (GET, POST, HEAD) (как будто это браузер) опять апачу!

Так вот вопрос, как это избежать, как избежать первого запроса ....

Автор: Mal Hack 26.8.2005, 12:03
Chuck проблема не может быть в mod_rewrite, если ты не допустил логическую ошибку.
Покаи полностью .htaccess.

Автор: Irokez 26.8.2005, 12:28
Цитата(Chuck @ 26.8.2005, 11:54)
Нифига он браузеру не может отрпавлять, глупость!

я про сервер

Автор: Chuck 26.8.2005, 13:01
Mal Hack, вот он
Код


RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)[/]?([^/]*)?[/]?([^/]*)?[/]?$ index.php?part=$1&p1=$2&p2=$3&%{QUERY_STRING}[L]

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)