我正在使用OpenAthensSP返回可能访问我们服务的IdP元数据。 OpenAthensSP以HTTP(s)头中的环境变量的形式返回此数据,然后我们在PHP中读取(来自$ _SERVER)。
到目前为止一切顺利。
但是,当使用mod_rewrite重写OpenAthens调用的URL时,将删除元数据(即HTTP头中包含的OpenAthens的环境变量)。我已经在并排测试中展示了这一点:直接调用PHP脚本(存在元数据)vs将URL重写为完全相同的PHP(剥离的元数据,但其他值,例如cookie存在且未更改)。被剥离的值具有非常长的值(太长以至于无法在此处粘贴 - 超过100k) - 这是我能看到的唯一潜在问题。这些值是正确的URL编码。
我已尝试在Apache中设置LimitRequestFieldSize和LimitRequestLine之类的东西,但它们没有任何效果,所以我认为问题必须在于mod_rewrite。
所以问题基本上是:
如何在仍然使用mod_rewrite的情况下在HTTP标头中保留非常长的值?
我目前的解决方案并不是很好,我必须这样做(来自VirtualHost部分的httpd.conf片段):
# /discovery is the URL called by OpenAthens to supply us IdP metadata
RewriteCond %{REQUEST_URI} ^/discovery [NC]
RewriteRule .* - [L]
# ... other rewrites here to send (nearly) everything else to index.php ...
ErrorDocument 404 /index.php
这样,index.php收到“/ discovery”请求,并且看到$ _SERVER中的冗长值存在并且正确,尽管404被触发,不用说是丑陋和hacky。
我不能做的只是将OpenAthens的输出直接发送到有效页面(例如,discovery.php),因为需要元数据来填充必须存在于所使用的PHP框架内的登录表单 - 必须从index.php开始。
(如果重要:这是在CentOS 5.6 / Apache 2.2.3上)
答案 0 :(得分:0)
作为一个使用OpenAthensSP的人,我知道数据是在Apache子流程环境中传递的,而不是HTTP头 - 它永远不会传递给用户的客户端。这也解释了为什么LimitRequestFieldSize和LimitRequestLine没有任何影响 - 它们只适用于HTTP请求标头。我怀疑发生的事情是你的重写规则以某种方式干扰了请求。如果他们正在创建内部请求,那么在PHP中使用apache_getenv函数可能会更好,而不是依赖于$ _SERVER变量。