我在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
来完成此工作?
答案 0 :(得分:0)
我无法使用SetEnv
和if reqenv
来解决此问题,因此我不得不使用Define
和IfDefine
。
我将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
进行开发。