在 IIS 7 中,如何重定向并捕获原始 URL?

在 IIS 7 中,如何重定向并捕获原始 URL?

我有一个用 Python 编写的特殊 CGI 脚本;我们姑且称之为peculiar.py,我想“回答”对特定目录及其下的任何内容的所有 HTTP 请求,然后从环境变量中捕获原始 URL。原始 URL 稍后将使用。到目前为止,我正在尝试重定向到默认文档,然后调用环境变量来获取相关内容。我还没有找到任何相关内容。

概念演练如下:

  1. 用户访问类似的 URL http://site.domain.tld/videos/fun-stuff.html
  2. 用户点击“今日搞笑链接”链接,该链接带有一个指向 的 href http://site.domain.tld/redirect-source/2013-01-10/
  3. IIS 7 收到请求http://site.domain.tld/redirect-source/2013-01-10/
  4. IIS 7 重定向到http://site.domain.tld/redirect-target/
  5. Peculiar.py,作为 中的默认文档http://site.domain.tld/redirect-target/,被唤醒。
  6. Peculiar.py 发现原始 URL 是http://site.domain.tld/redirect-source/2013-01-10/
  7. 之后进行更多处理。

我最初的步骤是:

  1. 在“redirect-target”目录中创建peculiar.py默认文档,这样就http://site.domain.tld/redirect-target/可以由 来回答http://site.domain.tld/redirect-target/peculiar.py。这样就成功了。

  2. 使用 HTTP 重定向功能,因此http://site.domain.tld/redirect-source/subdir1/item1.ext将被重定向到http://site.domain.tld/redirect-target/并由 应答http://site.domain.tld/redirect-target/peculiar.py。这有效。

  3. 尝试获取环境变量并找到一个好的引用者。(或者referer,正如祖父辈的错误拼写继续)

现在,peculiar.py只需抓取所有环境变量并将它们以 HTML 格式输出,以便我可以检查它们。

Found (302)我发现,当我使用、Permanent (301)甚至设置 HTTP 重定向时Temporary (307),我可以管理重定向,但无法获取原始 URL。如果我访问,HTTP_REFERER 根本不会显示在环境变量列表中http://site.domain.tld/redirect-source/subdir1/item1.extHTTP_REFERER如果我将其作为超链接嵌入网页,它确实会出现在环境变量列表中http://site.domain.tld/redirect-source/subdir1/item1.ext,但它只显示原始网页。

看起来重定向只是……跳过了 referrer。是因为 referer 是从客户端传递过来的,而不是从服务器传递过来的吗?

背景是,我正在编写一个脚本,该脚本会输出 Quicktime 的参考电影(二进制文件,即时构建)和 QTL 文件等内容,这两者都会根据调用的原始 URL 而变化。是的,这需要大量工作才能避免链接中的查询字符串。

我是不是忽略了某些显而易见的东西?重定向是不是错误的工具,无法回答特定目录下的所有 URL?我是不是忽略了某个设置web.config,而我对此几乎一无所知?

我愿意接受其他方法,只要我可以使用 Python 和 IIS。

答案1

我认为您的问题是,在响应 HTTP/301 或 HTTP/302 时是否发送 Referer 标头尚未定义。请记住,在 HTTP 重定向中,服务器会发送带有新 Location 标头的 301/302,但浏览器是重新请求的东西(和决定是否添加 Location 标头)。

最好的选择可能是将 Referer 的原始值作为查询字符串参数传回 301/302,例如(伪):

HTTP/1.1 302 Found
Location: http://site.domain.tld/redirect-target/?orig=http://site.domain.tld/redirect-source/2013-01-10/

orig然后在 Python 脚本中捕获的值。

您可能需要自定义 ASP 来执行实际的重定向,使用 Response.Redirect(),而不是依赖于内置的 IIS 功能。

更多的:https://stackoverflow.com/questions/2158283/will-a-302-redirect-maintain-the-referer-string

相关内容