Проблемы с оберткой CGI для PHP - PullRequest
3 голосов
/ 03 марта 2010

У меня есть проблема с оболочкой CGI для PHP. Я очень мало знаю о CGI и PHP как CGI.

Вот что я знаю о системе:

  • Солярис 10 на 386
  • Suhosin
  • PHP обычно работает как CGI, с cgiwrap (http://cgiwrap.sourceforge.net/). Я не могу найти пример wrapper.cgi на сервере для просмотра.
  • Общий хостинг (виртуальный хост), поэтому у меня нет доступа к конфигурации Apache. Но админы не помогают. Переключение хостов не вариант.
  • Директива опций не может быть переопределена в .htaccess (например, ExecCGI).

.htaccess:

AddHandler php-handler .php  
Action php-handler "/bin/test.cgi"

~ / public_html / бен / test.cgi:

#!/usr/bin/sh

# Without these 2 lines, I get an Internal Server Error
echo "Content-type: text/html"
echo ""

exec "/path/to/php-cgi" 'foo.php';

/ бен / foo.php:

<?php 
echo "this is foo.php!";

Выход http://mysite.com/bin/test.cgi:

X-Powered-By: PHP/5.2.11 Content-type: text/html echo "Content-type: text/html" echo "" exec "/path/to//php-cgi" 'foo.php';

Вывод http: / /mysite.com/anypage.php:

X-Powered-By: PHP/5.2.11 Content-type: text/html echo "Content-type: text/html" echo "" exec "/path/to//php-cgi" 'foo.php';

Вещи, которые я отмечаю:

  • PHP выполняется, как отмечено в заголовке X-Powered-By ....
  • В результатах выводится источник из /bin/test.cgi.
  • Что бы я ни указывал в качестве второго аргумента exec, он не передается в двоичный файл php. Я пытался '-i' получить phpinfo, '-v' получить версию ...
  • Когда я выполняю test.cgi через оболочку, я получаю ожидаемые результаты (аргумент передается php, и он отражается в выводе).

Есть идеи о том, как заставить это работать?

UPDATE

  • Похоже, что причина появления источника test.cgi была связана с ошибками. Каждый раз, когда происходила фатальная ошибка, либо внутри самого cgi, либо с помощью команды, выполняемой exec, это приводило к появлению источника cgi.
  • В test.cgi я могу получить правильный вывод с помощью exec "/path/to/php-cgi" -h (я получаю то же самое, что и из CLI).

Ответы [ 4 ]

1 голос
/ 03 марта 2010

Не могу сказать, но вот некоторые мысли:

  • Не выводите ничего, прежде чем запускать скрипт php, так как сам php обрабатывает заголовок ответа.

  • Для вызова скрипта попробуйте exec "/path/to/php-cgi \"/path/to/script/foo.php\""

Надеюсь, я смогу помочь.

РЕДАКТИРОВАТЬ

Возможно, вы захотите взглянуть на этот пост Стюарта Герберта. В частности, часть, где он пишет:

#!/bin/bash

/usr/bin/php-cgi "$@"

Этот сценарий просто выполняет нашу центральную копию исполняемого файла PHP CGI, передавая любые параметры, которые Apache вызывает с помощью сценария bash.

1 голос
/ 03 марта 2010

Пара мыслей:

  1. Я почти уверен, что suhosin не принесет вам много пользы здесь. Не то чтобы это повредило что-нибудь. Но в этом случае сценарии PHP будут выполняться под очень непривилегированными пользователями (можно надеяться). Средства контроля доступа к системам сохранят сценарий в изолированной среде.

  2. Насколько я понимаю, вы можете использовать следующие директивы конфигурации (забавно, что ваш бинарный файл php-cgi расположен на /usr/bin/php-cgi, вы можете просто обращаться к PHP-сценариям и запускать их как CGI обычным способом.

    ScriptAlias /local-bin /usr/bin
    AddHandler application/x-httpd-php5 php
    Action application/x-httpd-php5 /local-bin/php-cgi

    Воткните это в конфиг. Загрузите файл php. Хит файл php из вашего браузера, и все должно работать.

1 голос
/ 03 марта 2010

Почему бы просто не поместить файл php-cgi непосредственно в папку bin и поместить его как ваш обработчик, а не в test.cgi, вызывающий его.

0 голосов
/ 27 декабря 2012

Вы получаете внутреннюю ошибку сервера, поскольку он ожидает, что файл содержит Perl, а не код PHP? Я имею в виду, где находятся теги <?php ?> (без них это текст, который не будет анализироваться как PHP) ... Думаю, никто не может подобрать AddType следующим образом - я бы предложил добавить AddType в директиву <Directory> - в порядке чтобы остальное не изменилось (я думаю, что путь как шаблон - это проблема). Кроме того, exec() ожидает 3 параметра, которые должны быть заключены в скобки - по крайней мере, в PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...