Linux за българи: Форуми

Програмиране => Web development => Темата е започната от: Naka в Apr 16, 2010, 15:39



Титла: Http грешка при външно include?
Публикувано от: Naka в 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, което очевидно е грешно.







Титла: Re: Http грешка при външно include?
Публикувано от: VladSun в 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. ?>


Титла: Re: Http грешка при външно include?
Публикувано от: VladSun в Apr 16, 2010, 15:49
Това също е интересно:

http://www.askapache.com/htaccess/503-service-temporarily-unavailable.html


Титла: Re: Http грешка при външно include?
Публикувано от: Naka в Apr 16, 2010, 15:51
Е ама много си бърз  [_]3, не успях да си допиша поста. Мерси. Точно към това  503 Service Unavailable се бях насочил, но се чудя дали няма да сгреша нещо. Грешката трябва да е такава че за Гоогле да означава и "посети ме отново".


Титла: Re: Http грешка при външно include?
Публикувано от: VladSun в Apr 16, 2010, 15:56
Видя ли линка във второто ми мнение?


Титла: Re: Http грешка при външно include?
Публикувано от: Naka в 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 часа. Виждам противоречиви примери. Или изобщо не трябва да се задава?





Титла: Re: Http грешка при външно include?
Публикувано от: VladSun в Apr 20, 2010, 11:54
За allow_url_fopen - вярно е - опитват се да ограничат евентуалните пробиви в сигурността до LFI (иначе става RFI) - не знам кои хостинг компании го правят и кои не - обади им се :)


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


Титла: Re: Http грешка при външно include?
Публикувано от: vm13 в Apr 20, 2010, 14:07
Научавам, че много хостинги забранявали allow_url_fopen.

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



Титла: Re: Http грешка при външно include?
Публикувано от: Naka в Apr 20, 2010, 15:04
Научавам, че много хостинги забранявали allow_url_fopen.

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

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

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

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



Титла: Re: Http грешка при външно include?
Публикувано от: VladSun в Apr 20, 2010, 18:00
Научавам, че много хостинги забранявали allow_url_fopen.

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

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


Титла: Re: Http грешка при външно include?
Публикувано от: vm13 в Apr 20, 2010, 22:11
Цитат
Трябва да е инсталиран curl все пак
Според мен, вероятността на shared hosting да има curl е много по-голяма, от колкото да му е разрешено да отваря отдалечени адреси. Друг е въпроса, че за целта, за която иска да го използва, curl е ужасно бърз! Ако търси универсално решение, кода няма да е кратък.


Титла: Re: Http грешка при външно include?
Публикувано от: VladSun в Apr 21, 2010, 00:14
Не оспорвам нищо, което си казал в това мнение. Оспорвам твърдението "ще работи на всеки сървър" по отношение на curl. Мисля, че си ме разбрал, както и аз разбирам твоите доводи - т.е. на едно мнение сме.

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