Я пытаюсь создать простую веб-службу, которая должна возвращать различные 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? Или, может быть, я так устал, что мне не хватает чего-то тривиального?
Спасибо, ребята, и извините за длинный пост.
Я знаю, что ... Я сожалею, но я не могу видеть, как это этот ответ был связан с моим вопросом. – swahnee
@swahnee Вы делаете запрос HEAD, а не запрос GET. Если вы добавите -v в свой локон, вы увидите это в своем заголовке. Или вы можете изменить -I на -D-файл. Это все равно будет печатать заголовок ответа в файл, но отправит запрос GET. – ben
О, хорошо ... спасибо! Меня обманула печать PHP $ _SERVER, которая постоянно говорила мне, что это запрос GET. И извините symcbean, если я не получил это маленькое слово «HEAD» раньше :) – swahnee