Apache setHandler 仅适用于索引

Apache setHandler only only works on index

我正在使用 docker 在 PHP powered craft 网站上进行本地开发。我的共享主机需要一个 SetHandler php70-cgi 指令,但是官方 PHP 容器中的 apache 版本没有 php-cgi 并且不解释 PHP 脚本。因为容器只是开发,而不是尝试 1:1 复制生产,我试图使用设置 InDocker 请求变量的自定义 apache 配置来解决这个问题:

<VirtualHost *:80>
  ServerAdmin me@mydomain.com
  DocumentRoot /var/www/craft/public
  SetEnv InDocker true

  <!-- ... more config -->
</VirtualHost>

还有一个 .htaccess 在我的 public 文件夹中,它有条件地检查请求环境并且只运行:

Header set InDocker "%{InDocker}e"
<FilesMatch \.php$>
  <If "!reqenv('InDocker') =~ /true/">
    Header set IfMatch "We are not in docker"
    SetHandler php70-cgi
  </If>
  Header set FilesMatch "yo"
</FilesMatch>

当我向我的应用程序的根发出请求时,一切都正确呈现并且我看到以下 headers:

http -h :4020/
InDocker: true
FilesMatch: yo

但是,如果我向另一条路径发出请求,则无法正确呈现,我可以看到设置了以下 headers:

http -h :4020/
InDocker: true
FilesMatch: yo
IfMatch: We are not in a container

有没有一种方法可以使用我的 If 或更好的方法来使用 SetHandler 有条件地完成?

我无法使用 SetEnvif reqenv 让这个工作,所以我不得不退回到使用 DefineIfDefine.

我将 Define InDocker 添加到我的容器的 apache 配置中:

<VirtualHost *:80>
  ServerAdmin me@mydomain.com
  DocumentRoot /var/www/public
  Define InDocker

  <Directory /var/www/public>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order deny,allow
    Allow from all
  </Directory>

   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

然后在我的 .htaccess 文件中使用 IfDefine

<IfDefine !InDocker>
  <FilesMatch \.php$>
    SetHandler php70-cgi
  </FilesMatch>
</IfDefine>

这让我可以在我的共享主机上保持原样,并使用相同的 .htacess 进行开发。