我有一个用 Python 编写的特殊 CGI 脚本;我们姑且称之为peculiar.py
,我想“回答”对特定目录及其下的任何内容的所有 HTTP 请求,然后从环境变量中捕获原始 URL。原始 URL 稍后将使用。到目前为止,我正在尝试重定向到默认文档,然后调用环境变量来获取相关内容。我还没有找到任何相关内容。
概念演练如下:
- 用户访问类似的 URL
http://site.domain.tld/videos/fun-stuff.html
。 - 用户点击“今日搞笑链接”链接,该链接带有一个指向 的 href
http://site.domain.tld/redirect-source/2013-01-10/
。 - IIS 7 收到请求
http://site.domain.tld/redirect-source/2013-01-10/
。 - IIS 7 重定向到
http://site.domain.tld/redirect-target/
。 Peculiar.py
,作为 中的默认文档http://site.domain.tld/redirect-target/
,被唤醒。- Peculiar.py 发现原始 URL 是
http://site.domain.tld/redirect-source/2013-01-10/
。 - 之后进行更多处理。
我最初的步骤是:
在“redirect-target”目录中创建
peculiar.py
默认文档,这样就http://site.domain.tld/redirect-target/
可以由 来回答http://site.domain.tld/redirect-target/peculiar.py
。这样就成功了。使用 HTTP 重定向功能,因此
http://site.domain.tld/redirect-source/subdir1/item1.ext
将被重定向到http://site.domain.tld/redirect-target/
并由 应答http://site.domain.tld/redirect-target/peculiar.py
。这有效。尝试获取环境变量并找到一个好的引用者。(或者
referer
,正如祖父辈的错误拼写继续)
现在,peculiar.py
只需抓取所有环境变量并将它们以 HTML 格式输出,以便我可以检查它们。
Found (302)
我发现,当我使用、Permanent (301)
甚至设置 HTTP 重定向时Temporary (307)
,我可以管理重定向,但无法获取原始 URL。如果我访问,HTTP_REFERER 根本不会显示在环境变量列表中http://site.domain.tld/redirect-source/subdir1/item1.ext
。 HTTP_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