使文件扩展名由 PHP 解释

Make file extension to be interpreted by PHP

我将其添加到我的 .htaccess 文件中:

AddHandler fcgid-script .test

(我正在使用 FastCGI / VirtualMin / WebMin)

并创建了一个包含以下内容的 test.test 文件;

<?php echo "test"; ?>

这会导致内部服务器错误,错误日志中会出现以下消息:

[Thu Apr 16 14:12:57.631287 2015] [fcgid:warn] [pid 2646] (104)Connection reset by peer: [client xxxx:53595] mod_fcgid: error reading data from FastCGI server
[Thu Apr 16 14:12:57.631402 2015] [core:error] [pid 2646] [client xxxx:53595] End of script output before headers: test.test

我做错了什么?我尝试使用不同的处理程序名称,例如 x-httpd-php 或 x-httpd-php5 但这根本没有任何作用。

我也试过:

<FilesMatch "\.test$">
  SetHandler fcgid-script
</FilesMatch>

但它有相同的内部服务器错误。

似乎 FastCGId 模块不知道如何执行您的脚本 - FcgidWrapper directive seems to be missing (as your PHP script doesn't have a Shebang)。

根据您的发行版,您必须手动设置它,或者您可以调整已经处理 .php 文件的现有指令以也处理 .test 文件(通常这应该使用 "SetHandler fcgid-script" 指令和 setting/duplicating FcgidWrapper 指令)。

调整后的例子(取自https://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#examples):

<FilesMatch "\.test$">
    AddHandler fcgid-script .test
</FilesMatch>
Options +ExecCGI
FcgidWrapper /usr/bin/php5-cgi .test

更多信息和示例:https://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#exampleshttp://tltech.com/info/php-on-fcgid/

其他问题可能基于权限,例如如果您使用的是 suexec,则 fastcgid 进程无法写入日志或无法执行包装器脚本。如果您能说明正常的 .php 文件是否正确执行,这将非常有帮助。

尝试在您的 htaccess 文件中使用它

AddType application/x-httpd-php .test

查看这个 Stack Overflow 问题:Problem with Executing CGI Scripts on Apache

我不是 fastcgi 专家。我googled这个问题。我在 virtualmin 中收到了 2 个类似的问题。我只是附加那里发布的答案。

https://www.virtualmin.com/node/34903

  1. 转到 virtualmin\your 虚拟 server\server configuration\website 选项\
  2. select "Apache mod_php (run as Apache's user)" 然后保存
  3. 切换回 "FCGId (run as virtual server owner)"(它将要求您 运行 作为域所有者的 CGI 脚本)
  4. 保存

https://www.virtualmin.com/node/25539

转到/home/sitename/fcgi-bin 使用 follpwoing 命令重置不可变标志

"chattr -i php5.fcgi"

然后删除 /home/sitename/etc 和 /home/sitename/fcgi-bin 目录(确保与 php 不相关的任何内容都被保存) 使用 virtualmin 切换回 apache mod_php 模式,然后再回到 FCGId 模式。该网站现在应该可以使用了 不要忘记将 public_html 中任何被 apache 访问的 files/directories chown:请注意,这些通常都是站点名称。

希望对您有所帮助。

我质疑 fcgid-script 处理程序。这不是一个正常的 PHP 处理程序,即使对于 FCGI 也是如此。通常你会看到

<FilesMatch "\.test$">
     SetHandler application/x-httpd-php
</FilesMatch>

或者

<FilesMatch "\.test$">
     SetHandler php5-fcgi
</FilesMatch>

如果这些都不起作用,请检查以确保 PHP FCGI 已安装。

所有 CGI 脚本都要求您在脚本顶部添加 Shebang 行。

所以如果你想 运行 PHP 你应该包括像这样的东西:

#!/path/to/php

在脚本的顶部使其工作

已测试并验证有效:

因为您提到您正在使用 Webmin,所以我为 Webmin 量身定制了答案。您也可以通过 shell 编辑 Apache 的配置来完成此操作。

我会注意到,通常最好编辑 Apache 的配置,在这种情况下可能是不可避免的,因为我不相信您可以在 .htaccess 中进行此类编辑。尽管可能存在我不熟悉的 hack,但服务器管理员可能希望将其锁定在 apache 配置中。 .htaccess 带有流氓文件扩展名的文件以 per-directory 为基础到处乱飞的想法不仅听起来很慢,而且非常不安全。

步骤

我通过 VirtualBox 在 Ubuntu 14.04 上安装了 Apache。我添加了 Webmin 和 FastCGI。

我采取了以下步骤:

  1. 登录 Webmin,转到您的虚拟主机。
  2. 单击编辑指令
  3. 在底部添加以下内容:

<Directory />
    #Your SetHandler script here 
    #(@MrTux's script works here but NOT IN .htaccess)
    
    Require all granted
</Directory>
  1. 点击保存
  2. 点击顶部的“应用更改”。
  3. 大功告成!

我会注意到 SetHandler 传递了一些 headers,因此如果您在 .htaccess 中声明它,则有可能 headers 已经发送,这就是触发错误的原因.同样,如果您可以控制系统,.htaccess 不是设置规则的首选方式。在这种情况下,它可能会导致安全问题。