使文件扩展名由PHP解释

Wes*_*ley 20 php apache .htaccess mod-fcgid

我把它添加到我的.htaccess文件中:

AddHandler fcgid-script .test
Run Code Online (Sandbox Code Playgroud)

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

并打包带有内容的test.test文件;

<?php echo "test"; ?>
Run Code Online (Sandbox Code Playgroud)

这会导致内部服务器错误,并在错误日志中显示以下消息:

[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
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我尝试使用不同的处理程序名称,如x-httpd-php或x-httpd-php5,但这根本不起作用.

我也尝试过:

<FilesMatch "\.test$">
  SetHandler fcgid-script
</FilesMatch>
Run Code Online (Sandbox Code Playgroud)

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

MrT*_*Tux 6

似乎FastCGId模块不知道如何执行您的脚本 - FcgidWrapper指令似乎缺失(因为您的PHP脚本没有Shebang).

根据您的发行版,您必须手动设置它,或者您可以调整已经处理.php文件的现有指令以处理.test文件(通常这应该使用"SetHandler fcgid-script"指令并设置/复制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
Run Code Online (Sandbox Code Playgroud)

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

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


smc*_*nes 2

经测试和验证可正常工作:

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

我会注意到,通常最好编辑 Apache 的配置,在这种情况下可能是不可避免的,因为我不相信您可以在.htaccess. 尽管可能存在我不熟悉的 hack,但服务器管理员可能希望将其锁定在 apache 配置中。.htaccess具有恶意文件扩展名的文件在每个目录的基础上飞来飞去的想法不仅听起来很慢,而且非常不安全。

脚步

我通过 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>
Run Code Online (Sandbox Code Playgroud)
  1. 单击“保存”
  2. 单击顶部的“应用更改”。
  3. 你完成了!

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