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
有条件地完成?
我无法使用 SetEnv
和 if reqenv
让这个工作,所以我不得不退回到使用 Define
和 IfDefine
.
我将 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
进行开发。
我正在使用 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
有条件地完成?
我无法使用 SetEnv
和 if reqenv
让这个工作,所以我不得不退回到使用 Define
和 IfDefine
.
我将 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
进行开发。