CGI-скрипт не выполняет каждое посещение страницы

У меня есть сценарий CGI, который создает файл на сервере, а затем перенаправляет браузер на этот вновь созданный файл.

#!/bin/bash
printf "Content-type: text/html\n\n";
cat /myspecialdir/foo > /httpd/foo.html
echo "<HTML><HEAD><BODY>"
echo "<META HTTP-EQUIV=\"CACHE-CONTROL\" CONTENT=\"NO-CACHE\">"
echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"1; URL=/foo.html\">"
echo "</BODY></HEAD></HTML>"

Файл /myspecialdir/foo содержит некоторый динамический контент, который я хочу разместить в /httpd/foo.html. Затем я хочу, чтобы скрипт перенаправлял туда после создания нового файла.

У меня проблема в том, что скрипт не получает новые данные при каждом обращении из браузера. Например, если я захожу на http://myip/cgi-bin/genfoo.cgi, впервые в IE данные генерируются и перенаправляются на foo.html. После этого, если я перехожу на страницу CGI с помощью кнопки «Назад», она не запускается повторно, и меня перенаправляют на устаревшие данные.

Как я могу заставить CGI-скрипт выполняться даже с помощью кнопки «Назад»?

EDIT: я пытался сделать это с помощью заголовков HTTP, но, похоже, это не работает. Вот новый скрипт, я что-то пропустил?

#!/bin/bash
cat /myspecialdir/foo > /httpd/foo.txt
printf "Pragma-directive: no-cache\n\n";
printf "Cache-directive: no-cache\n\n";
printf "Cache-control: no-cache\n\n";
printf "Pragma: no-cache\n\n";
printf "Expires: 0\n\n";
printf "Location: /foo.txt\n\n";
printf "Content-type: text/html\n\n";

Все это делает, когда я захожу через IE, чтобы распечатать заголовки на странице, например:

Прагма-директива: без кеша

Кэш-директива: без кеша

Кэш-контроль: без кеша

Прагма: без кеширования

Истекает: 0

Местонахождение: /BACtrace.txt

Тип содержимого: текст / html

РЕДАКТИРОВАТЬ:

Оказывается, это была проблема с HTTP-сервером, который я использовал (busybox v1.12.1). Мне не удалось отправить заголовки HTTP, как было первоначально рекомендовано, но я смог заставить это работать с комбинацией META-тегов и настройки в IE8 (Инструменты -> Свойства обозревателя -> История просмотров -> Кнопка настроек - -> отметьте «Каждый раз, когда я посещаю веб-сайт»).

META-теги, которые я использовал:

echo "<meta http-equiv=\"expires\" content=\"0\" />"
echo "<META HTTP-EQUIV=\"Pragma-directive\" CONTENT=\"no-cache\"/>"
echo "<META HTTP-EQUIV=\"Cache-directive\" CONTENT=\"no-cache\"/>"
echo "<META HTTP-EQUIV=\"Cache-control\" CONTENT=\"no-cache\"/>"
echo "<META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\"/>"
echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"1; URL=/foo.txt\"/>"

person cigarman    schedule 04.08.2009    source источник


Ответы (2)


Это не отвечает на ваш вопрос, поэтому не стесняйтесь голосовать против, но вы можете сделать это намного проще для себя, выполнив следующие действия:

#!/bin/bash

cat /myspecialdir/foo > /httpd/foo.html

printf "Location: /foo.html\n\n";

Это отправляет браузеру заголовок, сообщающий ему о перенаправлении на /foo.html вместо загрузки и анализа тегов <meta>.

Изменить. Вы должны отправлять только 1 \n в конце каждого заголовка. После всего запроса вы отправляете 2 из них, вот так (разбито для ясности):

#!/bin/bash
cat /myspecialdir/foo > /httpd/foo.txt
printf "Pragma-directive: no-cache\n";
printf "Cache-directive: no-cache\n";
printf "Cache-control: no-cache\n";
printf "Pragma: no-cache\n";
printf "Expires: 0\n";
printf "Location: /foo.txt\n";
printf "\n";

(Также обратите внимание, что заголовок Content-Type не включен)

person Sean Bright    schedule 04.08.2009
comment
Прости, Шон, но это не перенаправляет. Все, что нужно сделать, это вывести Location: /foo.html в браузере. Я что-то упускаю? Новый сценарий: #!/bin/ash cat /myspecialdir/foo › /httpd/foo.txt printf Расположение: /foo.txt\r\n; printf Директива прагмы: no-cache\r\n printf Директива кэша: no-cache\r\n printf Управление кэшем: no-cache\r\n printf Прагма: no-cache\r\n printf Срок действия: 0 \r\n - person cigarman; 04.08.2009
comment
Спасибо за пояснение, Шон. Похоже, что сервер, который я использую (httpd из старого BusyBox), нарушает это, потому что он автоматически отправляет заголовок Content-type: text/plain, который не позволяет моему сценарию отправлять заголовки. Так что, к сожалению, мне приходится использовать метатеги. - person cigarman; 04.08.2009

Вам нужно указать браузеру (и возможным прокси) отключить кеширование файла с соответствующими заголовками HTTP:

Pragma-directive: no-cache
Cache-directive: no-cache
Cache-control: no-cache
Pragma: no-cache
Expires: 0

Конечно, вы просто добавите их в свой скрипт следующим образом:

printf "Pragma-directive: no-cache\r\n";

В этих директивах есть изрядная избыточность. Все это, вероятно, не обязательно, но хорошо убедиться, что есть что-то, что понимают все браузеры и прокси.

person Ville Laurikari    schedule 04.08.2009