Автор Тема: Http грешка при външно include?  (Прочетена 2614 пъти)

Naka

  • Напреднали
  • *****
  • Публикации: 2859
    • Профил
Http грешка при външно include?
« -: Apr 16, 2010, 15:39 »
Имам следната ситуация два PHP скрипта - А и В намиращи се на различни сървери.

Само А е публичен и той прави заявка за инклуде към скрипта B, който се намира физически на друго място:

А(сървер 1) -------> В(сървер2 - БД)

Скрипта А има следното съдържание:
Код:
$in = file_get_contents('http://www.example.com/snimki/В.php?'.
"id=$id&page=$page");

// за интернет търсачки, паяци, Гоогле, е необходимо връщане на правилни хедъри, 404, 410 при достъп към несъществуващо id
if ($in === false)
{ foreach ($http_response_header as $header) echo header($header); die(); }

print $in;

Това работи правилно. Освен това скрипта В е отговорен за връщането на правилни http хедъри към А, когато има някъкъв проблем от страната на В.
Например ако А заяви id=322 към В и В от своя страна знае че няма id с номер 322 в БД той връща http 410 gone, и А от своя страна  също изобразява http 410 gone.

Само А е публичен и се вижда от Goggle. Например ако Гоогле заправи заявка към такова id към А, то Goggle също ще види http 410 gone и втори път няма да посети А.

Въпросът ми е ако в момента Интернет връзката е прекъсната между А и В (или пък В е изключен), какъв Http Error хеадър трябва да изфабрикува А?

В такава ситуация $in === false и $http_response_header е празен. и от страна на А виждам следното: 200 OK, което очевидно е грешно.





« Последна редакция: Apr 17, 2010, 11:57 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: Http грешка при външно include?
« Отговор #1 -: Apr 16, 2010, 15:47 »
Предполагам 503 - Service Unavailable


В http://php.net/manual/en/function.header.php има даже по-подробно описание:

Код
GeSHi (PHP):
  1. <?php ob_start();
  2. @header("HTTP/1.1 503 Service Temporarily Unavailable");
  3. @header("Status: 503 Service Temporarily Unavailable");
  4. @header("Retry-After: 120");
  5. @header("Connection: Close");
  6. ?><!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
  7. <html><head>
  8. <title>503 Service Temporarily Unavailable</title>
  9. </head><body>
  10. <h1>Service Temporarily Unavailable</h1>
  11. <p>The server is temporarily unable to service your
  12. request due to maintenance downtime or capacity
  13. problems. Please try again later.</p>
  14. </body></html><?php
  15. echo $g;
  16. exit();
  17. ?>
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: Http грешка при външно include?
« Отговор #2 -: Apr 16, 2010, 15:49 »
Това също е интересно:

http://www.askapache.com/htaccess/503-service-temporarily-unavailable.html
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

Naka

  • Напреднали
  • *****
  • Публикации: 2859
    • Профил
Re: Http грешка при външно include?
« Отговор #3 -: Apr 16, 2010, 15:51 »
Е ама много си бърз  [_]3, не успях да си допиша поста. Мерси. Точно към това  503 Service Unavailable се бях насочил, но се чудя дали няма да сгреша нещо. Грешката трябва да е такава че за Гоогле да означава и "посети ме отново".
« Последна редакция: Apr 16, 2010, 15:56 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: Http грешка при външно include?
« Отговор #4 -: Apr 16, 2010, 15:56 »
Видя ли линка във второто ми мнение?
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

Naka

  • Напреднали
  • *****
  • Публикации: 2859
    • Профил
Re: Http грешка при външно include?
« Отговор #5 -: Apr 20, 2010, 11:39 »
Да прочетох го. Направих го така:
Код
GeSHi (PHP):
  1. $in = file_get_contents('http://www.example.com/snimki/В.php?'."id=$id&page=$page");
  2.  
  3. // за интернет търсачки, паяци, Гоогле, е необходимо връщане на правилни хедъри, 404, 410 при достъп към несъществуващо id
  4. if ($in === false)
  5. {
  6. // При прекъсване на Интернет, спрян сървер или грешка на file_get_contents("http://..."),
  7. // трябва да се върне правилен хедър 503, за да се информира клиента, Гоогле или паяка да посети
  8. // отново страницата. В тази ситуация $in е false a $http_response_header е празен.
  9. if (empty($http_response_header))
  10. {
  11. $http_response_header[]="HTTP/1.1 503 Service Unavailable";
  12. $http_response_header[]="Retry-After: 120";
  13. }
  14. foreach ($http_response_header as $header) echo header($header); die('Service error');
  15. }
  16.  
  17. print $in;

Имам няколко въпроса:
Научавам, че много хостинги забранявали allow_url_fopen. Вярно ли е това? Понеже имам намерение да го качвам някъде, как стои въпросът със allow_url_fopen в БГ? Препоръчван БГ хостинг?

allow_url_fopen може да се отбранява само чрез php.ini. Не може да се контролира чрез ini_set(allow_url_fopen, '1') нито чрез .htaccess

Какво би трябвало да бъде времето за Retry-After: 120.
Малко 120 секунди или Голямо - 2 часа. Виждам противоречиви примери. Или изобщо не трябва да се задава?



« Последна редакция: Apr 20, 2010, 11:51 от VladSun »
Активен

Perl - the only language that looks the same before and after encryption.

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: Http грешка при външно include?
« Отговор #6 -: Apr 20, 2010, 11:54 »
За allow_url_fopen - вярно е - опитват се да ограничат евентуалните пробиви в сигурността до LFI (иначе става RFI) - не знам кои хостинг компании го правят и кои не - обади им се :)


За Retry-After - ти си преценяваш :) Би трябвало да можеш да определиш колко дълго вторият сървер ще е недостъпен.
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

vm13

  • Напреднали
  • *****
  • Публикации: 43
  • Distribution: Ubuntu 10.04
  • Window Manager: Gnome
    • Профил
Re: Http грешка при външно include?
« Отговор #7 -: Apr 20, 2010, 14:07 »
Научавам, че много хостинги забранявали allow_url_fopen.

Така и трябва. За да си сигурен, че този код ще работи на всеки сървър, насочи се към cUrl, вместо file_get_contents.

Активен

Naka

  • Напреднали
  • *****
  • Публикации: 2859
    • Профил
Re: Http грешка при външно include?
« Отговор #8 -: Apr 20, 2010, 15:04 »
Научавам, че много хостинги забранявали allow_url_fopen.

Така и трябва.

Това е едно голямо глупаво оправдание от страна на хостинг компаниите.

Ами ако искам да правя поразии, не мога ли да ги направя по същият начин с CURL?
Ами отварянето на URL с параметри чрез браузер какво е? Да не би да е нещо по различно от  file_get_contents('http://www.example.com/....

За CURL знам и съм го правил, Само дето се получава малко по дълъг код. Причината поради която  използвам file_get_contents() е че ми трябва много кратък код.

« Последна редакция: Apr 20, 2010, 20:13 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: Http грешка при външно include?
« Отговор #9 -: Apr 20, 2010, 18:00 »
Научавам, че много хостинги забранявали allow_url_fopen.

Така и трябва. За да си сигурен, че този код ще работи на всеки сървър, насочи се към cUrl, вместо file_get_contents.

Трябва да е инсталиран curl все пак ;)
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

vm13

  • Напреднали
  • *****
  • Публикации: 43
  • Distribution: Ubuntu 10.04
  • Window Manager: Gnome
    • Профил
Re: Http грешка при външно include?
« Отговор #10 -: Apr 20, 2010, 22:11 »
Цитат
Трябва да е инсталиран curl все пак
Според мен, вероятността на shared hosting да има curl е много по-голяма, от колкото да му е разрешено да отваря отдалечени адреси. Друг е въпроса, че за целта, за която иска да го използва, curl е ужасно бърз! Ако търси универсално решение, кода няма да е кратък.
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: Http грешка при външно include?
« Отговор #11 -: Apr 21, 2010, 00:14 »
Не оспорвам нищо, което си казал в това мнение. Оспорвам твърдението "ще работи на всеки сървър" по отношение на curl. Мисля, че си ме разбрал, както и аз разбирам твоите доводи - т.е. на едно мнение сме.

По отношение на използването на file_get_contents('http://www.example.com/....') - нищо лошо няма, но тази функция е под общото ограничение на allow_url_fopen директивата, която също така управлява include/require "..." - там точно се прявява LFI/RFI, и точно срещу това използване се "защитават" хостинг доставчиците.
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
Include Directive
Преводи на документация
kennedy 0 1426 Последна публикация Apr 27, 2002, 11:38
от kennedy
#include <hashmap>
Общ форум
aSmith 2 1366 Последна публикация Dec 27, 2004, 12:17
от aSmith
PHP include
Web development
svincho 4 1455 Последна публикация Aug 17, 2005, 08:28
от svincho
Include latin layout + не може да се активира
Настройка на програми
Vatman 0 741 Последна публикация Jan 04, 2007, 20:15
от Vatman
Php include() bug
Web development
VladSun 6 2182 Последна публикация Oct 16, 2007, 19:42
от VladSun