【问题标题】:Make file extension to be interpreted by PHP使文件扩展名由 PHP 解释
【发布时间】:2015-06-23 20:54:18
【问题描述】:

我将此添加到我的 .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>

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

【问题讨论】:

  • “头文件前的脚本输出结束” - 也许你必须设置一些头文件来定义文件类型?
  • @MilanG 如我所见,日志中有 2 条错误消息,而第二条("End of script output before the headers")可能只是第一个的结果。
  • cgi 脚本必须是应用程序,即第一行必须是#!/usr/bin/php(解释器路径)

标签: php apache .htaccess mod-fcgid


【解决方案1】:

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

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

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

【讨论】:

  • 是的,普通的 PHP 文件(使用 FCGI)可以正常工作。添加站点时,我使用的是 webmin / virtualmin 提供的默认配置。
【解决方案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>
  1. 点击保存
  2. 点击顶部的“应用更改”。
  3. 大功告成!

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

【讨论】:

【解决方案3】:

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

AddType application/x-httpd-php .test

请参阅此 Stack Overflow 问题:Problem with Executing CGI Scripts on Apache

【讨论】:

  • 您应该知道这种方法是不安全的,因为 Apache 将匹配 .test 以及名称中包含 .test 的任何内容(即 .test.bad)。这就是&lt;FilesMatch&gt; 优越的原因,因为它使用正则表达式来确保只执行指定的文件。
  • IIRC application/x-httpd-php 只能与 mod_php 一起使用,请参阅 httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#examples 作为 mod_fastcgid 的示例
【解决方案4】:

我不是 fastcgi 人。我googled这个问题。我在virtualmin 中发布了 2 个类似的问题。我只是附上那里发布的答案。

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

  1. 转到 virtualmin\您的虚拟服务器\服务器配置\网站选项\
  2. 选择“Apache mod_php(以 Apache 的用户身份运行)”然后保存
  3. 切换回“FCGId(以虚拟服务器所有者身份运行)”(它会要求您以域所有者身份运行 CGI 脚本)
  4. 保存

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

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

"chattr -i php5.fcgi"

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

希望对你有帮助。

【讨论】:

    【解决方案5】:

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

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

    或者

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

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

    【讨论】:

    【解决方案6】:

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

    因此,如果您想运行 PHP,您应该包含以下内容:

    #!/path/to/php
    

    在脚本的顶部使其工作

    【讨论】:

      猜你喜欢
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      相关资源
      最近更新 更多