我正在使用 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 上)