这个 HTTP Authorization RewriteRule 是做啥的?

Posted

技术标签:

【中文标题】这个 HTTP Authorization RewriteRule 是做啥的?【英文标题】:What does this this HTTP Authorization RewriteRule do?这个 HTTP Authorization RewriteRule 是做什么的? 【发布时间】:2011-06-24 06:28:23 【问题描述】:

我的网站某处出现了由 Google Bot 引起的重写递归错误,但由于我的 Loglevel 较低,我找不到导致该错误的 url。我提出了它,但到目前为止还没有再次发生。

RewriteRule .* - [E=HTTP_AUTHORIZATION:%HTTP:Authorization]

我觉得所有的重写器都很好,并且有 [L] 标志,除了这个。

我不太明白。它来自开源商店系统 Magento。

据我所知,它除了设置环境变量 E 之外什么都不做。但这不是一种非常愚蠢的做法吗?如果这是目标,您不应该使用 SetEnv 吗?

【问题讨论】:

【参考方案1】:

Symfony developers Group 有一个很好的答案。我引用:

看起来您的主机将 php 作为 fcgi 运行,而不是 php5_module,就像您的 localhost 那样。 (phpinfo - 服务器 API: CGI/FastCGI)

重点是 php5_module 会自动处理 HTTP_AUTHORIZATION 标头,而 fcgi_module 不会。

解决方案很简单 - 将此行添加到托管服务器上的 .htacces:

RewriteRule .* - [E=HTTP_AUTHORIZATION:%HTTP:Authorization,L]

它对我有用

【讨论】:

如果有其他重写规则RewriteRule .* - [E=HTTP_AUTHORIZATION:%HTTP:Authorization]应该在之前添加,不带“L”选项【参考方案2】:

这一行将环境变量设置为用户身份验证字符串的值——本质上是设置一个变量而不是常量值。据我所知,SetEnv 和 SetEnvIf 只允许您将环境变量设置为预先确定的常量。

设置的变量实际上是 HTTP_AUTHORIZATION,而不是 E。我猜这是用户身份验证过程的一部分。

【讨论】:

如果您愿意,可以改用SetEnvIf。事实上,如果您在使用 mod_rewrite 的子目录中有 .htaccess 文件,这甚至可能更可取(因为您可能会覆盖您的身份验证!)。例如。 SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0

以上是关于这个 HTTP Authorization RewriteRule 是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章

http Authorization

HTTP 之 Authorization

HTTP Authorization

Http头部参数:Authorization

tp5.0如何获取header的Authorization值

Android WebView 添加authorization基本验证