【问题标题】:Apache RewriteMap prg using fopen('php://stdin', 'r') not working over HTTPSApache RewriteMap prg 使用 fopen('php://stdin', 'r') 不能通过 HTTPS
【发布时间】:2021-01-08 06:56:09
【问题描述】:

我已经使用prg 设置了一个 RewriteMap,它调用了一个 php 脚本,如下所示:

 #!/usr/local/bin/php
<?php

/* DB query generates $map */

$stdout = fopen('php://stdout', 'w');
$stdin  = fopen('php://stdin', 'r');
            
stream_set_write_buffer($stdout, 0);
            
while(!feof($stdin)):
                
    $input  = fgets($stdin);
            
    fputs($stdout, (array_key_exists($input,$map) ? $map[$input] : 'NULL') . "\n");
                
endwhile;
?>

然后 .htaccess 将输出放入一个环境变量 MAPTO 中,如下所示:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
  RewriteRule ^ - [E=MAPTO:${mymap:%1}]
  RewriteCond %{ENV:MAPTO} !=""
  RewriteRule ^.*$ http://myproxiedcontent.com/%{ENV:MAPTO}/$0 [P,NC]
</IfModule>

它在 HTTP 上正常工作,但在 HTTPS 上不返回任何输入。

我正在使用 Apache 2.4、PHP 7.2 并确认已安装 OpenSSL。

这里会发生什么?

【问题讨论】:

  • “没有返回输入”是指您的脚本在标准输入上没有收到任何内容,或者调用者没有收到您发送到标准输出的任何内容?另外,是否有可能是另一个 RewriteRule 胜过这个?
  • @ChrisHaas 似乎没有在标准输入上收到任何内容,否则它会写入我的日志?还有其他 RewriteRules,但如果我删除它们,它仍然表现得好像没有收到标准输入一样。
  • LogLevel rewrite:trace8 是否说您的任何重写都在做任何事情?它是否显示您的地图查找? rewritemap 不关心 HTTPS 的 HTTP,除了需要按虚拟主机进行重写的常见问题解答之外,并且不以通常的方式继承。
  • @covener LogLevel rewrite:trace8 表明使用 HTTPS 它正在执行相同的地图查找,但它没有从我的脚本生成任何输入。
  • @hwd 传递给 ${foo:...} 的密钥是如何计算的?不可能是空的?

标签: php apache mod-rewrite https stdin


【解决方案1】:

好的,我相信我想通了。我认为这个问题主要与 我正在使用 WHM 这一事实有关,它以极其复杂的方式处理 Apache 配置。

我必须搜索 httpd.conf 文件以了解我的虚拟主机配置设置。在这些设置的底部 - 正在配置 SSL - 是一个注释,表明与此虚拟主机相关的设置应添加到:

/etc/apache2/conf.d/userdata/ssl/2_4/{USERNAME}/{DOMAIN}.{TLD}

我将我的 RewriteMap 设置放在这里,现在它可以工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-25
    • 2023-03-11
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    相关资源
    最近更新 更多