PHP için CGI sarıcı ile ilgili sorunlar

4 Cevap php

Ben PHP için bir CGI sarıcı ile bir süre bir Hisselerini yaşıyorum. Ben CGI CGI ve PHP hakkında çok az şey biliyoruz.

İşte sistemi hakkında bildiklerimiz:

  • Bir 386 10 Solaris
  • Suhosin
  • PHP normalde cgiwrap (http://cgiwrap.sourceforge.net/) ile, CGI olarak çalışan. Ben bakmak için sunucu üzerinde bir örnek wrapper.cgi bulmak mümkün değilim.
  • (Sanal konak) barındırma paylaşılan, bu yüzden Apache yapılandırma erişimi yok. Ama yöneticileri yararlı değildir. Ana geçiş bir seçenek değildir.
  • Options yönergesi (örneğin ExecCGI). Htaccess geçersiz olamaz.

. Htaccess:

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

~ / Public_html / bin / 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';

/ Bin / foo.php:

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

Çıktı 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 Çıktı:

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

Ben dikkat şeyler şunlardır:

  • X-Powered-By ... başlığında belirttiği gibi PHP, idam ediliyor.
  • source ve /bin/test.cgi sonuçlar çıktı.
  • Olursa olsun ben ikinci argüman olarak ne koymak exec, bu php ikili geçmedi. I '-i' phpinfo almak için denedim, '-v' sürümünü almak için ...
  • Ben kabuk aracılığıyla test.cgi çalıştırdığınızda, ben beklenen sonuçları almak (argüman php geçirilir ve çıktı yansıtılır).

Bu işe almak konusunda herhangi bir fikir?

UPDATE

  • Bu nedeni, source test.cgi görünen edildi hataları nedeniyle olduğu anlaşılmaktadır. Herzaman ölümcül hata cgi kendi içinde ya da komut exec, bu cgi kaynağı görünmesine neden olur tarafından yürütülmektedir ile ya oluştu.
  • Içinde test.cgi, I exec "/path/to/php-cgi" -h (ben CLI'den olduğu gibi aynı şey olsun) ile doğru çıktı alabilirsiniz.

4 Cevap

Neden sadece doğrudan bin klasöründe php-cgi dosya koymak ve onu çağıran test.cgi karşı olarak işleyici olarak koymak değil.

Düşünceler bir çift:

  1. Ben Suhosin burada çok iyi yapacaksın olmadığından eminim. O şey zarar olacak değil. Ancak, bu durumda, PHP betikleri very imtiyazsız kullanıcılar (bir umut) altında yürütmek için gidiyoruz. Giriş kontrol sistemleri araçları komut sandbox devam edecektir.

  2. Bu /usr/bin/php-cgi sadece erişim ve geleneksel şekilde CGI'lerin olarak PHP komut dosyalarını çalıştırabilirsiniz aşağıdaki yapılandırma direktiflerini (php-cgi ikili yer olduğunu eğlenceli kullanabilirsiniz benim anlayış.

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

    Config o sopa. Bir php dosyası yükle. Tarayıcınızdan php dosyasını çarptı ve tüm iş olmamalıdır.

Gerçekten söylemek ama burada bazı düşünceler vardır değil mi:

  • Php kendisi yanıt başlığını kolları gibi php komut dosyası exec önce çıkış değil bir şey yapmak.

  • Script try exec "/path/to/php-cgi \"/path/to/script/foo.php\"" aramak için

Ben yardımcı olabilir umuyoruz.

EDIT

Sen istiyorsun this post Stuart Herbert bir göz olabilir. Diye yazıyor kısmını özellikle:

#!/bin/bash

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

This script simply executes our central copy of the PHP CGI executable, passing through whatever parameters Apache has called the bash script with.

Bu dosya Perl, değil PHP kodu içeren bekliyor çünkü iç sunucu hatası alıyorum? Ben burada <?php ?> etiketleri (onlarsız bu metin ve PHP gibi çözümlenen olmaz) ... bir böyle AddType olamaz sanırım vardır, demek - Ben bir {[içinde AddType öneririm ( 1)]} direktifi - dinlenme etkilenmemiş olması için (desen olarak yol) sanırım, sorundur. En azından PHP - exec() parantez sarılmış olmalıdır 3 parametre bekler yanında.