2009-08-04 2 views
1

У меня есть сценарий 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 является не печатать заголовки на странице, например, так:

Pragma директивы: НЕТ КЭШИРОВАНИЯ

Cache-директива: нет кэша

Cache-контроль: нет кэша

Pragma: нет кэша

Ex Пирес: 0

Расположение: /BACtrace.txt

Content-тип: текст/html

EDIT:

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

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

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\"/>" 

ответ

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 не входит)

+0

К сожалению, Шон, но это Безразлично» t перенаправить. Все, что делает, это печать «Расположение: /foo.html» в браузере. Я что-то упускаю? Новый сценарий: #!/Bin/ash cat/myspecialdir/foo> /httpd/foo.txt printf "Местоположение: /foo.txt\r\n"; printf "Директива Pragma: no-cache \ r \ n" printf "Кэш-директива: no-cache \ r \ n" printf "Cache-control: no-cache \ r \ n" printf "Pragma: no-cache \ r \ n " printf" Истекает: 0 \ r \ n " – cigarman

+0

См. мое редактирование для деталей. –

+0

Спасибо за разъяснение, Шон. Похоже, что сервер, который я использую (httpd из более старого BusyBox), разбивает это, потому что он автоматически отправляет заголовок Content-type: text/plain, который мешает моему сценарию отправлять заголовки. Поэтому, не забудьте, я должен использовать теги META. – cigarman

1

Вам необходимо сообщить браузеру (и возможные прокси), чтобы отключить кэширование файла с соответствующими заголовками 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"; 

Существует справедливый bi t избыточности в этих директивах. Все, вероятно, не нужны, но хорошо убедиться, что там есть все браузеры и прокси.

Смежные вопросы