Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Выполнение Php как Cgi

15K
05 марта 2006 года
AlxVin
8 / / 05.03.2006
Возникла проблема: PHP-скрипты на сервере (FreeBSD) выполняются с правами nobody.

При этом скрипту надо писать и читать конфиденциальную информацию. Т.е. установка прав на каталог 700 - не дает читать/писать в ней.
А дать права для nobody - то же, что отдать файлы всем пользователям сервера... :(

Чтобы не переписывать проект на перл, решил запускать PHP как CGI. При этом права нормальные, из 700 читает и пишет.

НО! Почему то не передаются параметры ни через GET ни через POST...

Вот простенький пример:

----- Начало script.cgi -----
#!/usr/local/bin/php


<html>
<body>
<?
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
echo "<h1>Привет, " . $_POST['name'] . "</h1>";
}
?>
<form method="POST">
Имя: <input type="text" name="name">


<input type="submit" name="okbutton" value="OK">
</form>
</body>
</html>

----- Конец script.cgi -----


Так, вот, под виндой (Денвер) все работает. На двух хостингах разных - работает как cgi с правильными правами, но не получает переданные данные!!!

Файл лежит в документ_рут пробовал ложить в цги-бин - ничего не меняется...
HELP!
338
05 марта 2006 года
chigevara
529 / / 29.09.2003
почему не знаю.
Как?
$_GET = parse_str($_SERVER['QUERY_STRING']);
POST читаем из stdin.
15K
05 марта 2006 года
AlxVin
8 / / 05.03.2006
Спасибо большое!!!

Вот так все заработало:

#!/usr/local/bin/php

<html>
<body>
<?

if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
$stdin = fopen("php://stdin", "r");
$Post=fgets($stdin,5000);
fclose($stdin);
$_POST = parse_str($Post);
}

if ($_SERVER['REQUEST_METHOD'] == 'GET')
{
$_GET = parse_str($_SERVER['QUERY_STRING']);
}

if ($name) echo "<h1>Привет, ".$name." ".$surname."</h1>";


?>
<form method="POST">
Введите Ваше имя: <input type="text" name="name">


Введите Вашу фамилию: <input type="text" name="surname">



<input type="submit" name="okbutton" value="OK">
</form>
</body>
</html>
338
06 марта 2006 года
chigevara
529 / / 29.09.2003
Цитата:
Originally posted by AlxVin

if ($_SERVER['REQUEST_METHOD'] == 'POST')
if ($_SERVER['REQUEST_METHOD'] == 'GET')


ифы лучше убрать. Тебе может захотется сделать
<form action='script.php?var=val' method=post>
и тогда ты потеряешь var

15K
07 марта 2006 года
AlxVin
8 / / 05.03.2006
Так все и сделал, все отлично. Было. Пока не просмотрел страницу из под Оперы.

И ужаснулся! Оказывается, ИЕ пофиг заголовок, выдающийся страницей, он ее нормально показывает. А реально заголовок оказался: Content-type: text/plain

И под честной оперой я получил код страницы...

Сразу же подумал - менять хэдер срочно!
Но!!!

Вот так:
#!/usr/local/bin/php

<?
header("Content-type: text/html");
?>

- хэдер не меняется - говорит, он уже выдан с строке 3... Перевод строки же убрать нельзя - нужен отступ для пути к пхп.

Вот так... :(

Может не в ту сторону бегу???
338
08 марта 2006 года
chigevara
529 / / 29.09.2003
Цитата:
Originally posted by AlxVin

#!/usr/local/bin/php

<?
header("Content-type: text/html");
?>



Options +ExecCGI
AddType text/html cgi
в .htaccess

Возможно. Результат запости. И убедись что у тебя \n а не \r\n. И убери пустую строку после шебанга.

15K
08 марта 2006 года
AlxVin
8 / / 05.03.2006
Цитата:
Originally posted by chigevara
Options +ExecCGI
AddType text/html cgi
в .htaccess

Возможно. Результат запости. И убедись что у тебя \n а не \r\n. И убери пустую строку после шебанга.



Не поверишь :)
Секунду назад подправил .htaccess на такое:

Options ExecCGI
AddType text/html .cgi

И все заработало. А потом увидел твой пост :))
Правда все равно не понятно, почему я не смог модифицировать заголовки руками: возвратов каретки нет точно. Строку убрать после пути к пхп не могу - ругается (вспоминаю перл :)). Хотя перечитал кучу форумов, вроде ее там не нужно оставлять...

Кстати, мой новый .htaccess немножко отличается от предложенного тобой, где правильно?

338
08 марта 2006 года
chigevara
529 / / 29.09.2003
Цитата:
Originally posted by AlxVin
Не поверишь :)
Строку убрать после пути к пхп не могу - ругается (вспоминаю перл :)). Хотя перечитал кучу форумов, вроде ее там не нужно оставлять...

Кстати, мой новый .htaccess немножко отличается от предложенного тобой, где правильно?


Ты заставляешь апача слать нужный тебе хидер, но проблему ты не решил - свои хидеры слать не можешь, значит идет вывод контента ДО отработки скрипта.
Точка перед cgi нужна - моя ошибка, без точки фурычить не будет. А на счет плюса - в сомнениях ибо не в курсе его назначения. Копаю мануал.

338
08 марта 2006 года
chigevara
529 / / 29.09.2003
Normally, if multiple Options could apply to a directory, then the most specific one is taken complete; the options are not merged. However if all the options on the Options directive are preceded by a + or - symbol, the options are merged. Any options preceded by a + are added to the options currently in force, and any options preceded by a - are removed from the options currently in force.

ман апача
15K
08 марта 2006 года
AlxVin
8 / / 05.03.2006
Насчет плюсика понял, спасибо.

Поступил проще - залил файл script.cgi на ДРУГОЙ хостинг.

#!/usr/bin/php
<?php
header("Content-type: text/html");
echo 'HELLO';
?>


И все прекрасно работает.
На первом хостинге такое выдает: 500 Internal Server Error
Если сделать так:

#!/usr/bin/php

<?php
header("Content-type: text/html");
echo 'HELLO';
?>

то работает на ПЕРВОМ хостинге, НО хедеры не меняет, и правильно - перевод строки отправляется ведь в стдаут. Вот такие пироги. Хостер поймет ли... и в чем грабли...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог