【问题标题】:How to catch value of parameter in Apache2 CGI如何在 Apache2 CGI 中捕获参数值
【发布时间】:2011-01-03 17:33:47
【问题描述】:

我在 Ubuntu 上有一个小的 apache2 CGI 应用程序。 CGI 处理程序是 bash shell 脚本。
我的客户端应用程序是 search.html

<html>
<body>
<form action="/cgi-bin/search.sh" method="post">
    <input type="text" name="searchKey" size="10"></input>
    <input type=SUBMIT value="search">
<form>
</body>
</html>

首先,我只想在服务器端捕获“searchKey”参数的值。我尝试了以下操作,但没有显示任何内容。
search.sh 是:

#!/bin/bash
echo Content-type:text/plain 
echo ""

echo $SEARCHKEY

伙计们,你能告诉我如何在服务器端捕获参数的值吗?

更新

感谢您的所有回答。我知道​​要获得发布请求的值需要从 STDIN 读取数据。
我按照 Ithcy 的建议尝试了以下操作

#!/bin/bash
echo post=$(</dev/stdin)
echo 'content length:'$CONTENT_LENGTH
echo 'content:'$post

它只显示:

content length:30
content:

为什么内容什么都不是?我是否需要在 Apache 服务器上进行更多配置才能读取帖子数据? 谢谢

【问题讨论】:

    标签: bash web-applications shell apache2 cgi


    【解决方案1】:

    POST 将通过 STDIN。

    #!/bin/bash
    POST=$(</dev/stdin)
    echo $POST
    

    但是如果可以的话,你真的应该考虑使用 perl(或 python、PHP 等),正如 Glenn Jackman 所建议的那样。

    【讨论】:

      【解决方案2】:

      整个查询字符串在$QUERY_STRING 变量中表示。您可以通过在 shell 脚本中不带参数运行 env 来看到这一点。

      仅获取 searchKey 值的示例:

      echo $QUERY_STRING | sed 's/searchKey\=\([^&]\+\).*/\1/'
      

      更新:很抱歉,这仅适用于您使用 GET 发布表单的情况。我没有阅读详细信息=/

      如果您确实需要阅读 POST,此页面可能会对您有所帮助:http://digitalmechanic.wordpress.com/2008/02/21/handling-post-data-in-bash-cgi-scripts/ 不过,我没有让它工作。

      【讨论】:

      • POST 只是通过标准输入传递数据,因此可以像通过标准输入传递的任何其他数据一样处理...我在 shell 脚本中没有经验。
      【解决方案3】:

      很抱歉,这几个月没有人回答您的问题。这有效:

      #!/bin/bash
      echo
      echo post=$(</dev/stdin)
      echo 'content length:'$CONTENT_LENGTH
      echo 'content:'$post
      

      你必须在 /bin/bash 之后插入一个空行(如果没有 echo,printf "\n" 可以)

      【讨论】:

      • 使用 &lt;/dev/stdin 对我有用,不像使用 catread
      【解决方案4】:

      这是关于 CGI 协议的好文档:http://hoohoo.ncsa.illinois.edu/cgi/

      我建议您考虑使用具有良好 CGI 库的语言(例如 Perl),这样您就不必重新发明多年前已经完善的轮子。

      【讨论】:

        【解决方案5】:

        试试

        echo $1
        

        而不是

        echo $SEARCHKEY
        

        【讨论】:

        • 克劳斯比斯科夫,谢谢你的回答。但它仍然没有显示任何内容
        【解决方案6】:

        试试这个脚本来列出你输入的内容:

        #!/bin/bash
        echo 'content length:'$CONTENT_LENGTH
        read StringInBox
        echo $StringInBox
        

        【讨论】:

          猜你喜欢
          • 2020-04-07
          • 1970-01-01
          • 2014-04-18
          • 1970-01-01
          • 2013-02-12
          • 1970-01-01
          • 2012-01-14
          • 2013-10-03
          • 1970-01-01
          相关资源
          最近更新 更多