LINUX.ORG.RU

mod_rewrite - запустить скрипт


0

0

Такой вот вопрос. Есть vhost, на нем несколько файлов (неважно каких). Есть скрипт, который записывает дату последнего захода и ip посетителя.

Мне нужно чтобы этот скрипт запускался постоянно, как только пользователь попадает по ссылке на любой из этих файлов. Иначе говоря, пользователь заходит на сайт, жмет на какой-нибудь файл, а у меня запускается скрипт и записывает данные пользователя. Мне нужно сделать все это транспарентно.

Не подскажут ли спецы по всему как такое организовать с помощью mod_rewrite? Вот сейчас есть такое правило:

RewriteEngine On RewriteRule ^([^.]+\.txt)$ /cgi-bin/myscript.cgi [NC]

работает оно так - если пользователь открывает .txt с урла, то мой скрипт выполняется, но и .txt файла не показывает. Нужно чтобы показало .txt файл как обычно, но при этом запустился бы и мой скрипт.

★★★
Ответ на: комментарий от Fedor

>Так может скриптом тогда файл показывать?

именно так и надо скрипт из переменных окружения выкапывает имя затребуемого файла и выдает его сам, не забыв вставить корректные хеадеры(content-type)

но, нужна ли такая статистика лайв? А если уж очень нужна почему не повесится на лог апача и анализировать его?(искать по "чтение из дополняемого файла")

roller ★★★
()

В .htaccess можно прописать


RewriteEngine On 
RewriteCond %{HTTH_REFERER} !.*myscript\.cgi.*
RewriteRule ^([^.]+\.txt)$ /cgi-bin/myscript.cgi [NC]

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


В самом в скрипте что-то вроде:
--------------------
#!/usr/local/bin/perl

sub();

print "301 Moved Permanently\r\n";
print "Referer: /cgi-bin/myscript.cgi\r\n";
print "Location: ".$ENV{'REQUESRT_URI'}."\r\n\r\n";
die;

sub stat(){
   # пишем статистику
}
------------------

Сам не пробовал, возможно требует отладки :-). Особенно в пране регулярного выражения в ,htaccess и правильных заголовков в скрипте.

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

Немного подправил под себя, но вот что в итоге получается..

На деле ERROR 500, а в логах:
mod_rewrite: maximum number of internal redirects reached. Assuming configuration error. Use 'RewriteOptions MaxRedirects' to increase the limit if neccessary.

и хоть убейся.

.htaccess:
RewriteEngine On
RewriteCond %{HTTH_REFERER} !.*myscript\.cgi.*
RewriteRule ^(.+) /cgi-bin/myscript.cgi [NC]

myscript.cgi в конце плюет следущие заголовки:
Referer: /cgi-bin/myscript.cgi
Location: ${REQUEST_URI}

Далаем запрос на хедеры:

curl -e myscript.cgi --head http://localhost/files/file1.txt

в ответ получаем вот такую дребедень
HTTP/1.1 500 Internal Server Error
Date: Fri, 23 Nov 2007 09:20:55 GMT
Server: Apache
Referer: /cgi-bin/myscript.cgi.cgi, /cgi-bin/myscript.cgi.cgi, /cgi-bin/myscript.cgi.cgi, /cgi-bin/myscript.cgi.cgi, /cgi-bin/myscript.cgi.cgi, /cgi-bin/myscript.cgi.cgi, /cgi-bin/myscript.cgi.cgi, /cgi-bin/myscript.cgi.cgi, /cgi-bin/myscript.cgi.cgi, /cgi-bin/myscript.cgi.cgi
Connection: close
Content-Type: text/html; charset=iso-8859-1

Если подправить скрипт чтобы он в конце не делал Location: а слал например такой хедер:
Content-type: text/html\n
hello

То все в порядке - заходим на любой УРЛ и видим "hello".

вообщем получается что когда с Location:, то он зацикливает сам на себя вечно, хотя насколько я понимаю правило редиректа в .htaccess должно только один раз срабатывать
что-то здесь не так.

FreeBSD ★★★
() автор топика
Ответ на: комментарий от FreeBSD

> вообщем получается что когда с Location:, то он зацикливает сам на себя вечно, хотя насколько я понимаю правило редиректа в .htaccess должно только один раз срабатывать
что-то здесь не так.

Я вижу 2 наиболее вероятные проблемы:

1. Неверно прописан регексп. В RewriteCond как раз и прописано условие выхода из такого цикла - если Запрос идёт с реферером от скрипта.

Но скорее всего:

2. RewriteCond %{HTTH_REFERER} !.*myscript\.cgi.* - я опечатался, сорри...

Нету переменной окружения HTTH_REFERER, есть HTTP_REFERER :-) ... то есть если регексп верен, то правильным вариантом будет:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !.*myscript\.cgi.*
RewriteRule ^(.+) /cgi-bin/myscript.cgi [NC]

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

Спасибо за ответ, моя невнимателен был, в итоге приделал свой костыль.

Проблему решил другим, ИМХО более правильным способом. Файлы лежат в дире с левым именем типа (LSJDOnczxkjhywar, вообщем генеренная дира которую не разгадаешь). Также есть дира /files/, пустая.

.htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^files/(.+) /cgi-bin/myscript.cgi [NC]

RewriteCond есессено срабатывает, т.к. посетитель идет на /files/file.txt. Дальше скрипт уже выполняет что ему нужно и если все нормально, то делает внутрениий Location на /реальная_дира/file.txt (Location: /LSJDOnczxkjhywar/file.txt). Реальная директория не светится, т.к. внутренний редирект.

Все работает.

FreeBSD ★★★
() автор топика
Ответ на: комментарий от FreeBSD

Ну, костыль, так костыль...вот пример ещё одного :-)

Я уж из спортивного интереса во имя тяпницы набросал пример реализации такой фичи методом, который в этом топике уже предлагали :-)))

http://www.perpetum-mobile.ru/articles/cookbook/web/logger/

r_asian ★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.