Apache“销毁”授权头

6

经过大量的研究和试错,我变得绝望了。

我正在使用JwtAuthentication。我的客户端已经成功发送了Authorization头信息。几周前我没有遇到任何问题,但突然间,我的PHP脚本(因此是JwtAuthentication中间件)无法“看到”Authorization头信息,也无法“看到”我在.htaccess文件中声明的“SetEnv/SetEnvIf”变量。

我询问了服务器上的活动模块(我为托管付费),以查看是否启用了正确的模块,他们给我发送了这个:

  • core_module (静态)
  • so_module (静态)
  • http_module (静态)
  • mpm_worker_module (共享)
  • cgid_module (共享)
  • access_compat_module (共享)
  • actions_module (共享)
  • alias_module (共享)
  • auth_basic_module (共享)
  • authn_core_module (共享)
  • authn_file_module (共享)
  • authz_core_module (共享)
  • authz_groupfile_module (共享)
  • authz_host_module (共享)
  • authz_user_module (共享)
  • autoindex_module (共享)
  • deflate_module (共享)
  • dir_module (共享)
  • expires_module (共享)
  • filter_module (共享)
  • headers_module (共享)
  • include_module (共享)
  • log_config_module (共享)
  • logio_module (共享)
  • mime_module (共享)
  • negotiation_module (共享)
  • proxy_module (共享)
  • proxy_fcgi_module (共享)
  • proxy_http_module (共享)
  • rewrite_module (共享)
  • setenvif_module (共享)
  • slotmem_shm_module (共享)
  • socache_dbm_module (共享)
  • socache_shmcb_module (共享)
  • status_module (共享)
  • suexec_module (共享)
  • unique_id_module (共享)
  • unixd_module (共享)
  • userdir_module (共享)
  • ssl_module (共享)
  • bwlimited_module (共享)
  • security2_module (共享)
  • suphp_module (共享)
  • hostinglimits_module (共享)
根据我所阅读的,所有需要重写.htaccess文件和使用Authorization头的必要模块都已启用,甚至包括使用SetEnvIf声明环境变量的模块(就像我说的那样,我不知道为什么我不能使用它们)。
服务器配置如下: cPanel版本58.0(构建34) Apache版本2.4.23 PHP版本5.4.45 MySQL版本5.6.33 架构x86_64 操作系统linux
我已经尝试过:
- 在.htaccess中添加CGIPassAuth on - 修改RewriteCond如下: RewriteCond %{HTTP:Authorization} ^(.*) RewriteRule .* - [e=HTTP_AUTHORIZATION:%1] - 使用SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 - 在.htaccess文件上使用WSGIPAssAuthorization On会导致500错误(我不知道为什么) - 在.htaccess上使用CGIPassAuth on没有任何改变。

但是...没有任何作用。我问托管的人有关Apache的更改,但他们告诉我没有什么改变。

还有环境变量...为什么它们不起作用?

我知道有其他相关问题,但不幸的是,他们给出的解决方案无法解决我的问题。

是Apache的问题吗? 还是PHP的问题?

这里他们说可能是防火墙的问题,但如果是那样,环境应该能够工作,不是吗?而且不仅当我想将授权标头设置为变量时会出现问题;我通过SetEnvSetEnvIf设置的任何环境变量都无法在我的PHP脚本中看到。

问题可能是什么?

2个回答

6
如果您使用PHP-FPM和虚拟主机,您应该将以下内容添加到您的虚拟主机文件中。
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/local.mysite/htdocs/$1
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
SetEnvIf Content-Type "(.*)" HTTP_CONTENT_TYPE=$1
SetEnvIf Accept "(.*)" HTTP_ACCEPT=$1

1
你可以再解释一下为什么这是解决方案。 - astroanu
2
Apache出于安全原因不会将头信息发送给脚本。而PHP-FPM无法发送任何头信息,因此它也不会发送。您可以将头信息发送到Apache服务器-> Apache服务器使用头信息代理到PHP-FPM-> PHP-FPM使用头信息运行您的PHP脚本。清楚吗? - Enes Yurtlu

4

我在意外将我的MAMP PHP设置从模块切换到CGI后,开始出现了相同的症状。

根据我所了解的信息,出于许多原因,模块是更可取的选择。

检查您服务器上的等效设置,如果有必要,请进行更改。


嗨!我在等待我的托管提供商帮助我进行更改。实际上,他们的服务器正在以CGI / FastCGI运行,而我的本地主机正在以Apache 2.0处理程序运行。我希望这就是答案。无论如何,我认为你只是指引我朝着正确的方向,非常感谢你。 - Alex
谢谢。你的建议指引了我正确的方向。我的托管服务根据你的答案进行了更改,现在一切都正常了。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接