2013-09-18 3 views
0

Я пытаюсь создать простую веб-службу, которая должна возвращать различные HTTP-коды в зависимости от некоторых условий, в основном из-за существования файлов, связанных с конкретными ресурсами, запрошенными через URI. Тем не менее, я застрял в действительно странном поведении, которое я получаю, когда пытаюсь создать заголовок 404 через PHP.cURL default GET-запрос не распознается PHP

Первый фрагмент кода, который работает, выглядит следующим образом:

$isNotFound = TRUE; 
if ($isNotFound) header('HTTP/1.1 404 Not Found'); 

С помощью простой командной строки Curl для запроса URI, за которым работает этот сценарий, я получаю:

$ curl -LI http://www.example.com/ 
HTTP/1.1 404 Not Found 
Date: Wed, 18 Sep 2013 20:57.25 GMT 
Server: Apache/2.2.22 (Ubuntu) 
X-Powered-By: PHP/5.3.10-1ubuntu3.8 
Vary: Accept-Encoding 
Connection: clse 
Content-Type: text/html 

сейчас , то второе взятие как это:

$isNotFound = FALSE; 
if ($_SERVER['REQUEST_METHOD'] === 'GET') { 
    $isNotFound = TRUE; 
} 
if ($isNotFound === TRUE) { 
    header('HTTP/1.1 404 Not Found'); 
} 

Running Curl снова, на этот раз я получаю это:

$ curl -LI http://www.example.com/ 
HTTP/1.1 200 OK 
Date: ... 

Заголовок такой же, как и первый, за исключением кода. Чтобы проверить очевидное, я также напечатал значение $isNotFound незадолго до последнего if, и он действительно был оценен как TRUE, поэтому вызов header должен быть выполнен с кодом 404. Я также добавил exit() в последних if и еще header() в конце скрипта, введя другие коды в ответ (например, 302), и результат всегда состоит в том, что header внутри if игнорируется.

мне удалось сделать вторую работу сценария, явно указав метод запроса, как GET в локонах вызова:

$ curl -X GET -LI http://www.example.com/ 
HTTP/1.1 404 Not Found 
Date: ... 

Я также имел сомнение, что Curl не использовала GET как метод по умолчанию, но печать массива $_SERVER показала, что метод запроса действительно был GET.

Итак, в чем причина этого странного поведения? Является ли ошибка cURL при использовании неявного метода GET или что-то происходит внутри PHP? Или, может быть, я так устал, что мне не хватает чего-то тривиального?

Спасибо, ребята, и извините за длинный пост.

ответ

1

В следующий раз прочитать инструкцию:

-I, --head 
      (HTTP/FTP/FILE) Fetch the HTTP-header only! HTTP-servers feature the 
      command HEAD which this uses to get nothing but the header of a 
      document. When used on an FTP or FILE file, curl displays the 
      file size and last modification time only. 

(или лог-файлы веб-сервера, или ваш поток TCP)

+0

Я знаю, что ... Я сожалею, но я не могу видеть, как это этот ответ был связан с моим вопросом. – swahnee

+1

@swahnee Вы делаете запрос HEAD, а не запрос GET. Если вы добавите -v в свой локон, вы увидите это в своем заголовке. Или вы можете изменить -I на -D-файл. Это все равно будет печатать заголовок ответа в файл, но отправит запрос GET. – ben

+0

О, хорошо ... спасибо! Меня обманула печать PHP $ _SERVER, которая постоянно говорила мне, что это запрос GET. И извините symcbean, если я не получил это маленькое слово «HEAD» раньше :) – swahnee

Смежные вопросы