使文件扩展名由 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#examples 和 http://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 个类似的问题。我只是附加那里发布的答案。
- 转到 virtualmin\your 虚拟 server\server configuration\website 选项\
- select "Apache mod_php (run as Apache's user)" 然后保存
- 切换回 "FCGId (run as virtual server owner)"(它将要求您 运行 作为域所有者的 CGI 脚本)
- 保存
转到/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。
我采取了以下步骤:
- 登录 Webmin,转到您的虚拟主机。
- 单击编辑指令
- 在底部添加以下内容:
<Directory />
#Your SetHandler script here
#(@MrTux's script works here but NOT IN .htaccess)
Require all granted
</Directory>
- 点击保存
- 点击顶部的“应用更改”。
- 大功告成!
我会注意到 SetHandler 传递了一些 headers,因此如果您在 .htaccess
中声明它,则有可能 headers 已经发送,这就是触发错误的原因.同样,如果您可以控制系统,.htaccess
不是设置规则的首选方式。在这种情况下,它可能会导致安全问题。
我将其添加到我的 .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#examples 和 http://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 个类似的问题。我只是附加那里发布的答案。
- 转到 virtualmin\your 虚拟 server\server configuration\website 选项\
- select "Apache mod_php (run as Apache's user)" 然后保存
- 切换回 "FCGId (run as virtual server owner)"(它将要求您 运行 作为域所有者的 CGI 脚本)
- 保存
转到/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。
我采取了以下步骤:
- 登录 Webmin,转到您的虚拟主机。
- 单击编辑指令
- 在底部添加以下内容:
<Directory />
#Your SetHandler script here
#(@MrTux's script works here but NOT IN .htaccess)
Require all granted
</Directory>
- 点击保存
- 点击顶部的“应用更改”。
- 大功告成!
我会注意到 SetHandler 传递了一些 headers,因此如果您在 .htaccess
中声明它,则有可能 headers 已经发送,这就是触发错误的原因.同样,如果您可以控制系统,.htaccess
不是设置规则的首选方式。在这种情况下,它可能会导致安全问题。