1

我正在使用 OpenAthensSP 返回可能访问我们服务的 IdP 元数据。OpenAthensSP 在 HTTP(s) 标头中以环境变量的形式返回此数据,然后我们在 PHP 中读取(来自 $_SERVER)。

到目前为止,一切都很好。

但是,当 mod_rewrite 用于重写 OpenAthens 调用的 URL 时,元数据(即 HTTP 标头中包含的来自 OpenAthens 的环境变量)被剥离。我已经在并行测试中展示了这一点:直接调用 PHP 脚本(存在元数据)与将 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,这不用说是丑陋和骇人听闻的。

我不能做的只是将 OpenAthens 的输出直接发送到有效页面(例如,discovery.php),因为需要元数据来填充必须存在于正在使用的 PHP 框架中的登录表单——它必须启动关闭 index.php。

(以防万一:这是在 CentOS 5.6 / Apache 2.2.3 上)

4

1 回答 1

1

作为一个使用过 OpenAthensSP 的人,我知道数据是在 Apache 子进程环境中传递的,而不是 HTTP 标头——它永远不会到达用户的客户端。这也解释了为什么 LimitRequestFieldSize 和 LimitRequestLine 没有任何作用——它们只适用于 HTTP 请求标头。我怀疑正在发生的事情是您的重写规则以某种方式干扰了请求。如果他们正在创建一个内部请求,那么在 PHP 中使用 apache_getenv 函数而不是依赖 $_SERVER 变量可能会更好。

于 2012-11-22T10:49:17.650 回答