Apache setHandler仅适用于索引

时间:2018-04-10 02:38:39

标签: php apache2

我在PHP驱动的工艺网站上使用docker进行本地开发。我的共享主机需要SetHandler php70-cgi指令,但官方PHP容器中的apache版本没有php-cgi,也不解释PHP脚本。因为容器只是开发,而不是尝试1:1复制生产,所以我尝试使用自定义apache配置解决此问题,该配置设置InDocker请求变量:

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

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

我公共文件夹中的.htaccess有条件地检查请求env并且只运行:

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>

当我向我的应用程序的根目录发出请求时,事情会正确呈现,我会看到以下标题:

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

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

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

有没有办法可以使用If或更好的方式使用SetHandler来完成此工作?

1 个答案:

答案 0 :(得分:0)

我无法使用SetEnvif reqenv来解决此问题,因此我不得不使用DefineIfDefine

我将Define InDocker添加到我的容器的apache config:

<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>

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

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

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