代码之家  ›  专栏  ›  技术社区  ›  cigarman

CGI脚本不执行每次页面访问

  •  2
  • cigarman  · 技术社区  · 17 年前

    我有一个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脚本执行,即使是从后退按钮?

    编辑 :我尝试使用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指令:无缓存

    缓存控制:无缓存

    pragma:没有缓存

    期满:0

    位置:/bactrace.txt

    内容类型:文本/HTML

    编辑:

    结果发现这是我使用的HTTP服务器的问题(BusyBox v1.12.1)。我无法按照最初的建议发送HTTP头文件,但我可以在IE8中结合使用元标记和设置(工具-->Internet选项-->浏览历史记录-->设置按钮-->检查“每次访问网站时”)。

    我使用的元标记是:

    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 回复  |  直到 17 年前
        1
  •  2
  •   Sean Bright Sean Stinehour    17 年前

    这不能回答你的问题,所以你可以投反对票,但是你可以做到。 许多的 做以下事情对自己更容易:

    #!/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 不包括标题)

        2
  •  2
  •   Ville Laurikari    17 年前

    您需要告诉浏览器(以及可能的代理)禁用具有适当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";
    

    这些指令有相当多的冗余。所有这些可能都不是必需的,但最好确保有一些所有浏览器和代理都能理解的东西。

    推荐文章