apachecgi重定向到绝对URI';行不通

apachecgi重定向到绝对URI';行不通,apache,redirect,cgi,http-status-code-301,Apache,Redirect,Cgi,Http Status Code 301,我让Apache 2.2.13在Windows上以控制台模式运行。我制作了一个可执行文件来处理请求。在某种情况下,当它检测到指向目录但没有尾随斜杠的URL时,它会尝试重定向到附加了缺少斜杠的同一URL。退出代码设置为301。奇怪的是,在响应头中包含以下内容是行不通的: Location: /cgi-bin/mycgi.exe/something/ 但这确实: Location: something/ 我做错什么了吗?还是我在Apache中发现了一个bug?(如果是这样的话,我应该在哪里以及如

我让Apache 2.2.13在Windows上以控制台模式运行。我制作了一个可执行文件来处理请求。在某种情况下,当它检测到指向目录但没有尾随斜杠的URL时,它会尝试重定向到附加了缺少斜杠的同一URL。退出代码设置为301。奇怪的是,在响应头中包含以下内容是行不通的:

Location: /cgi-bin/mycgi.exe/something/
但这确实:

Location: something/
我做错什么了吗?还是我在Apache中发现了一个bug?(如果是这样的话,我应该在哪里以及如何发布它?

1)需要明确的是,重定向功能(例如,“看到时做什么”位置:http响应)在您的浏览器中,而不是在Apache中。我想你知道,但我想确认一下。它在这里相关的原因是,301响应中的地址需要是“单个绝对URI”。因此,您的URI示例缺少您的域名,例如,需要

虽然有些web客户机接受带有相对重定向的301,但其他客户机不接受

2) 您能否确切说明“不工作”的含义,包括客户端错误和Apache日志中的任何错误?谢谢

此外,请指定以下哪些URL在客户端工作,哪些不工作:


谢谢

通常,“Location”包含完整的URL,包括http:和主机名。这就是DVK概述的情况

位置:/cgi-bin/mycgi.exe/something/

这实际上是另一回事:内部重定向。它是由CGI定义的,并在其他一些源于CGI的服务器环境中工作,如PHP。当位置包含“虚拟路径”时,Apache会直接在该路径中提供页面/脚本,而浏览器不知道存在任何类型的重定向

显然,这不是您想要的,因为当浏览器永远看不到301时,执行301内部重定向是没有意义的

地点:什么/

另一方面,这也算不了什么。它不是完整的URL,也不是虚拟路径,因为它不是以“/”开头的。Apache不知道如何处理它,所以它只是猜测它不是一个虚拟路径,所以将它吐回浏览器,没有进一步的注释

在“Location”标题中将此消息发送到浏览器是无效的,但许多浏览器都会允许这样做,这就是为什么它看起来可以工作的原因。实际上,您应该传递完整的URL:

Location: http://www.example.com/cgi-bin/mycgi.exe/something/

谢谢我将修改“redirect prefix”以包含“http://”和“http_HOST”env值在调试时,我注意到mycgi.exe被重复调用,所有环境变量的完整副本都以“redirect_”为前缀,但没有更新的“REQUEST_URI”,因此这将循环,并复制env变量(“REDIRECT_REDIRECT_REDIRECT_…”将打破此循环,并导致Apache显示服务器错误通知页面。