【问题标题】:Apache CGI redirect to absolute URI doesn't workApache CGI 重定向到绝对 URI 不起作用
【发布时间】:2009-09-07 18:32:11
【问题描述】:

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

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

但确实如此:

Location: something/

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

【问题讨论】:

    标签: apache redirect cgi http-status-code-301


    【解决方案1】:

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

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

    这实际上是另一回事:内部重定向。它由the CGI specification 定义,并且可以在其他一些从CGI 派生的服务器环境中工作,例如PHP。当 Location 包含“虚拟路径”时,Apache 会立即在该路径中提供页面/脚本,而浏览器不知道有任何类型的重定向。

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

    地点:某物/

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

    在“位置”标头中将其发送到浏览器是无效的,但其中许多仍然允许它,这就是它看起来有效的原因。你真的应该传递完整的 URL:

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

    【讨论】:

    • 谢谢。我将修改“重定向前缀”以包含“http://”和“HTTP_HOST”环境值
    【解决方案2】:

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

    虽然一些网络客户端接受带有相对重定向的 301,但其他客户端不接受。

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

    另外,请指定以下哪些 URL 可以从客户端使用,哪些不能:

    谢谢

    【讨论】:

    • 调试时,我注意到 mycgi.exe 被重复调用,所有环境变量的完整副本都以“REDIRECT_”为前缀,但没有更新的“REQUEST_URI”,所以这会循环,并且 env-vars ("REDIRECT_REDIRECT_REDIRECT_...") 的重复会打破这个循环并导致 Apache 显示服务器错误通知页面。
    猜你喜欢
    • 2014-01-08
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多