2009-09-07 31 views
1

我在Windows上以控制台模式运行Apache 2.2.13。我制作了处理请求的可执行文件。在某些情况下,当它检测到指向目录的URL但没有结尾斜杠时,它会尝试重定向到缺少斜杠的URL。退出代码设置为301。奇怪的是,有这个在响应头不起作用:Apache CGI重定向到绝对URI不起作用

Location: /cgi-bin/mycgi.exe/something/ 

但确实:

Location: something/ 

难道我做错了什么?还是我在Apache中发现了一个错误? (如果是这样,我应该在哪里以及如何发布它最好?)

回答

1

一般,'位置'包含完整的网址,包括h ttp:和主机名。 DVK概述了这种情况。

地点:/cgi-bin/mycgi.exe/something/

这其实是别的东西:内部重定向。它由the CGI specification定义,并可用于从CGI派生的其他一些服务器环境,例如PHP。当“位置”包含“虚拟路径”时,Apache立即在该路径中提供页面/脚本,而浏览器不知道有任何类型的重定向。

显然,这不是你想要的,因为它没有意义的,做一个301内部重定向时,浏览器将永远不会看到这是一个301

位置:东西/

此,另一方面,什么也不是。它不是一个完整的URL,它不是一个虚拟路径,因为它不以'/'开头。 Apache不知道该如何处理它,所以它只是猜测它不是一个虚拟路径,因此将其返回给浏览器而无需进一步评论。

把'位置'标题发送到浏览器是无效的,但是它们中的许多都会允许它,这就是为什么它看起来有效。真的,你应该通过完整的URL:

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

谢谢。我将修改'重定向前缀'以包含“http://”和“HTTP_HOST”env值 – 2009-09-08 07:34:22

0

1)要清楚,重定向功能(例如“看到时应该做什么”位置:http响应)在您的浏览器中,而不是在Apache 。我假设你知道,但想确保清楚。它与此相关的原因是因为as per the RFC,301响应中的地址需要是“单个绝对URI”。因此,您的URI示例缺少您的域名,例如需要是http://your.web.server/cgi-bin/mycgi.exe/something/

虽然有些网络客户端接受301与相对重定向,其他人不。

2)您能否详细说明您的意思是“不起作用”,包括客户端的错误和Apache日志中的任何错误?由于

另外,请指定下列URL从客户端的工作,哪些没有:

感谢

+0

调试时,我注意到mycgi.exe正在一再呼吁,所有与“REDIRECT_”为前缀的环境变量的完整副本,但没有更新“REQUEST_URI “,所以这会循环,env-vars的重复(”REDIRECT_REDIRECT_REDIRECT _...“)会打破这个循环,并导致Apache显示服务器错误通知页面。 – 2009-09-08 07:38:03