如何让apache让我定义一个;200“好的”;是否使用位置标头进行响应?

如何让apache让我定义一个;200“好的”;是否使用位置标头进行响应?,apache,http,cgi,httpd.conf,Apache,Http,Cgi,Httpd.conf,以下是cgi bin目录中的内容: cgi-bin> cat test1 #!/bin/sh echo "Status: 200 OK" echo "Content-type: text/plain" echo echo "Hello world 1" cgi-bin> cat test2 #!/bin/sh echo "Status: 200 OK" echo "Content-type: text/plain" echo "Location: /cgi-bin/test1" e

以下是cgi bin目录中的内容:

cgi-bin> cat test1
#!/bin/sh
echo "Status: 200 OK"
echo "Content-type: text/plain"
echo
echo "Hello world 1"

cgi-bin> cat test2
#!/bin/sh
echo "Status: 200 OK"
echo "Content-type: text/plain"
echo "Location: /cgi-bin/test1"
echo
echo "Hello world 2"

cgi-bin> cat test3
#!/bin/sh
echo "Status: 201 Created"
echo "Content-type: text/plain"
echo "Location: /cgi-bin/test1"
echo
echo "Hello world 3"
下面是我对每一个人做一次攻击时得到的结果:

cgi-bin> curl -i https://localhost/cgi-bin/test1
HTTP/1.1 200 OK
Date: Wed, 20 Nov 2019 15:56:43 GMT
Server: Apache
Transfer-Encoding: chunked
Content-Type: text/plain

Hello world 1

cgi-bin> curl -i https://localhost/cgi-bin/test2
HTTP/1.1 200 OK
Date: Wed, 20 Nov 2019 15:56:44 GMT
Server: Apache
Transfer-Encoding: chunked
Content-Type: text/plain

Hello world 1

cgi-bin> curl -i https://localhost/cgi-bin/test3
HTTP/1.1 201 Created
Date: Wed, 20 Nov 2019 15:56:45 GMT
Server: Apache
Location: /cgi-bin/test1
Transfer-Encoding: chunked
Content-Type: text/plain

Hello world 3
注意,/cgi-bin/test2忽略shell脚本打印的“Hello world 2”主体,而是显示
test1
的输出。如何让它使用“Hello world 2”作为响应,而不更改状态或位置标题

编辑:更新了curl示例以包含HTTP头。刚才注意到/cgi-bin/test2也没有在响应中包含Location头

Location response标头指示将页面重定向到的URL。 它仅在使用3xx(重定向)或201时提供含义 (创建)状态响应

在您的情况下,您发送的200带有一个不符合要求的位置。Curl可能假设它是一个201,所以这里是应用的:

HTTP 201创建的成功状态响应代码表明 请求已成功并导致创建资源。这个 在发送回此响应之前,将有效地创建新资源 新资源返回到消息体中,其 位置是请求的URL或请求的内容 位置标题

由于您发送的是相互冲突的标题,因此无法要求Curl以有意义的方式处理该问题


出于好奇,你为什么要这么做?资源应该是200、201或重定向,而不是它们的混合。如果要将位置标头用于其他内容,则需要发送一个自定义标头,如
my custom Location
,并对其进行相应的处理。

对我的效果与预期一样:

[root@pe610 cgi-bin]# curl http://localhost/cgi-bin/test2
Hello world 1
[root@pe610 cgi-bin]# curl http://localhost/cgi-bin/test1
Hello world 1
[root@pe610 cgi-bin]# apachectl -V
Server version: Apache/2.4.6 (CentOS)
Server built:   Nov  5 2018 01:47:09
Server's Module Magic Number: 20120211:24
Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/httpd"
 -D SUEXEC_BIN="/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="/run/httpd/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

RE:你为什么要这么做?这是我正在实现的REST协议所要求的,在一个不寻常的情况下。回复:您发送了一个带有位置的200,这是不符合要求的。我知道这不是推荐的使用位置标题的方法,但是我从来没有发现任何东西(例如in)表明它实际上是错误的?看来apache正在这样做,而不是curl。因此,我希望有一些方法可以以不同的方式配置apache,或者说服此REST协议的所有者这不是正确的做法。如果将
-I
选项与curl一起使用,您会看到什么?您将能够看到Apache实际发送了什么,以及它是否进一步操纵了您的头文件。显然,我不能在注释中使用回车符<代码>cgi-bin>curl-Ihttps://localhost/cgi-bin/test2 HTTP/1.1 200确定日期:2019年11月20日星期三15:45:26 GMT服务器:Apache内容类型:text/plain谢谢,这证实了Patrick的回答,由于最终的头没有
位置
,因此重定向已经预先处理过。我还应该注意,CGI规范指出,如果是本地头,Apache应该在内部处理位置重定向。换句话说,位置头和CGI可能有一些不发送到客户端的奇怪行为。谢谢所以基本上,我看到的行为实际上是正确的,我不应该试图改变它。