使用 .htaccess 变更 PHP 版本

有时候我们需要在不同的项目文件夹下使用不同版本的php,虽然可以通过变更apache配置文件httpd.conf来切换,但每次都需要重启apache服务才能生效,非常不方便。

安装fcgid模块

这时需要apache安装一个mod fcgid模块。
下载地址:
https://www.apachehaus.com/cgi-bin/download.plx

下载后将mod_fcgid.so文件拷贝至apache的modules目录,然后在httpd.conf文件末尾添加:

LoadModule fcgid_module modules/mod_fcgid.so

重启apache

使用htaccess

在文件夹下放置一个.htaccess文件,在里面规定该文件夹下使用的php版本:

AddHandler fcgid-script .php
Options +ExecCGI
FCGIWrapper E:/www/server/php8/php-cgi.exe .php

注意

apache使用fastcgi模式来运行php后,可能会导致非index.php页面出现No input file specified的错误。这是由于有的php框架是基于PATH_INFO来执行路由的,使用fastcgi模式后,$_SERVER中没有了PATH_INFO,故导致这个错误。
解决办法:
将伪静态.htaccess文件中的:

RewriteRule ^(.*)$ index.php/$1 [L]

修改为:

RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]

然后打印$_SERVER会发现多了REDIRECT_PATH_INFO,然后修改php程序,使用REDIRECT_PATH_INFO来替代之前的PATH_INFO

完整的包含伪静态+PHP版本的.htaccess文件内容:

AddHandler fcgid-script .php
Options +ExecCGI
FCGIWrapper E:/www/server/php8/php-cgi.exe .php


<IfModule mod_rewrite.c>
  Options +FollowSymlinks -Multiviews
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
</IfModule>

发表评论

邮箱地址不会被公开。 必填项已用*标注