2009-08-04 7 views
1

Ich habe ein CGI-Skript, das eine Datei auf dem Server generiert und den Browser dann an diese neu generierte Datei weiterleitet.CGI-Skript, das nicht bei jedem Seitenaufruf ausgeführt wird

#!/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>" 

Die Datei/myspecialdir/foo enthält einige dynamische Inhalte, die ich in /httpd/foo.html sein wollen. Ich möchte dann, dass das Skript nach der Generierung der neuen Datei dorthin umleitet.

Das Problem, das ich habe, ist, dass das Skript keine neuen Daten bei jedem Treffer von einem Browser erhält. Zum Beispiel, wenn ich http://myip/cgi-bin/genfoo.cgi das erste Mal in IE besuche, werden die Daten generiert und es wird zu foo.html umgeleitet. Wenn ich dann mit der Zurück-Schaltfläche zur CGI-Seite gehe, wird sie nicht erneut ausgeführt und ich werde zu veralteten Daten weitergeleitet.

Wie kann ich das CGI-Skript zwingen, sogar von der Zurück-Taste auszuführen?

EDIT: Ich habe versucht, dies mit dem HTTP-Header-Ansatz, aber das scheint nicht zu funktionieren. Hier ist das neue Skript, vermisse ich etwas?

#!/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"; 

All dies tut, wenn ich zu Besuch über IE die Header in der Seite zu drucken ist, etwa so:

Pragma-Direktive: no-cache

Cache-Direktive: no-cache

Cache-control: no-cache

Pragma: no-cache

Ex Pires: 0

Ort: /BACtrace.txt

Content-type: text/html

EDIT:

Es stellt sich heraus, das ein Problem mit dem HTTP-Server war ich wurde mit (busybox v1.12.1). Ich konnte die HTTP-Header nicht wie ursprünglich empfohlen senden, aber ich konnte das mit einer Kombination von META-Tags und einer Einstellung in IE8 (Extras -> Internetoptionen -> Browserverlauf -> Einstellungen-Taste - -> check "Jedes Mal, wenn ich eine Website besuche").

Die META-Tags I verwendet werden, sind:

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

Antwort

2

diese Antwort Ihre Frage nicht, so nach unten Abstimmung frei fühlen, aber Sie können auf sich selbst diese viel einfacher machen, indem Sie:

#!/bin/bash 

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

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

Dieser einen Header an den Browser sendet sie an zu erzählen Umleiten zu /foo.html anstatt die <meta> Tags laden und analysieren zu müssen.

Bearbeiten: Sie sollten nur 1 \n am Ende jedes Header senden. Nachdem die gesamten Anfrage senden Sie zwei von ihnen, wie diese (aus Gründen der Übersichtlichkeit ausgebrochen):

#!/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"; 

(Beachten Sie auch, dass die Content-Type Header nicht enthalten)

+0

Sorry, Sean, aber das doesn‘ t umleiten. Es wird nur "Ort:/foo.html" im Browser gedruckt. Fehle ich etwas? Das neue Skript lautet: #!/Bin/ash cat/meinspecialdir/foo> /httpd/foo.txt printf "Ort: /foo.txt\r\n"; printf "Pragma-Direktive: no-cache \ r \ n" printf "Cache-Direktive: no-cache \ r \ n" printf "Cache-Kontrolle: no-cache \ r \ n" printf "Pragma: no-cache \ r \ n " printf" Ablauf: 0 \ r \ n " – cigarman

+0

Siehe meine Bearbeitung für Details. –

+0

Danke für die Klarstellung, Sean. Es sieht so aus, als ob der Server, den ich benutze (httpd von einer älteren BusyBox), dies durchbricht, weil er automatisch den Header Content-type: text/plain sendet, der verhindert, dass mein Skript Header sendet. Also, ich muss META-Tags verwenden. – cigarman

1

Sie müssen den Browser (und mögliche Proxies) sagen, Caching der Datei mit den entsprechenden HTTP-Header zu deaktivieren:

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

Natürlich , fügen Sie einfach jedes diese in Ihrem Skript so ein:

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

Es gibt eine faire bi t Redundanz in diesen Richtlinien. Alle sind wahrscheinlich nicht notwendig, aber es ist gut, sicherzustellen, dass es etwas gibt, was alle Browser und Proxies da draußen verstehen.