#php #web-services #apache #rest #http-headers
#php #веб-сервисы #apache #rest #http-заголовки
Вопрос:
Я пишу веб-сервис RESTful, который возвращает пользовательские / существующие HTTP-заголовки при успешных / неуспешных операциях.
Например, если проверка подлинности завершится неудачей, будет отправлен HTTP-заголовок 401 и т.д.
Я отправил заголовки с помощью функции PHP header (), но, конечно, это не отправляется обратно вызывающему. Что мне действительно нужно сделать, так это отправить заголовки через Apache, вместо PHP, обратно вызывающему скрипту. Я выполняю определенные проверки данных, которые я получаю в своем веб-сервисе, а затем отправляю заголовки. Как бы мне вместо этого отправить эти заголовки через Apache?
Спасибо!
Ответ №1:
Я отправил заголовки с помощью функции PHP header (), но, конечно, это не отправляется обратно вызывающему.
Почему вы так уверены? Я склонен думать, что вы где-то делаете что-то не так…
Комментарии:
1. Я вызвал скрипт через curl и прочитал заголовки. Я получил 200 OK вместо 500, которые я специально туда ввел. Я также просмотрел это с помощью дополнения LiveHTTPHeaders и получил 200 OK вместо 500.
2. Возможно, современные браузеры настолько интеллектуальны, что они интерпретируют допустимый ответ как 200 OK вместо 500. Но мои предположения несколько неуклюжи.
Ответ №2:
Я бы, вероятно, сделал это с PHP, а не с Apache, но это всего лишь мои собственные предпочтения. Если вызов header()
не работает, это, вероятно, потому, что у вас есть пробелы за пределами тегов PHP где-то перед вашим вызовом header()
. Обратите внимание на это в руководстве по PHP:
Помните, что header() должен вызываться перед отправкой любого фактического вывода, будь то с помощью обычных HTML-тегов, пустых строк в файле или из PHP. Очень распространенной ошибкой является чтение кода с помощью функций include() или require() или другой функции доступа к файлам, в котором перед вызовом header() выводятся пробелы или пустые строки. Та же проблема существует при использовании одного файла PHP / HTML.
Если вы должны сделать это с помощью Apache, mod_headers, похоже, не подходит. mod_headers могут устанавливать заголовки только на основе условий успешного выполнения запроса (2xx) или для любого запроса. Смотрите Директиву Header.
Вместо этого, я думаю, это можно было бы сделать с помощью комбинации использования mod_rewrite и mod_asis. У меня нет конкретного «рецепта» для этого, но идея заключалась бы в том, чтобы проверить, авторизован ли запрос с помощью mod_rewrite, и если он не авторизован, перепишите / перенаправьте URI запроса в документ .asis, который содержит информацию заголовка, которую вы хотите отправить обратно.
Комментарии:
1. В скрипте перед вызовом заголовков нет пробелов. Я дважды проверил это. Дважды. Есть идеи, как я мог бы использовать mod_headers для отправки требуемых заголовков вызывающему?
Ответ №3:
Нашел решение. Передайте ‘true’ в качестве второго аргумента header() и фактический код состояния в качестве третьего аргумента. Например, header(‘HTTP 1.1/400 Bad Request’, true, 400). Это принудительно отправит вызывающему код состояния 400. Я проверил это по крайней мере в LiveHTTPHeaders, так что это может сработать. Мне просто нужно вызвать это через curl, чтобы быть полностью уверенным.
Комментарии:
1.
HTTP 1.1/400 Bad Request
неправильно; должно бытьHTTP/1.1 400 Bad Request
. И использование второго и третьего параметров при уже указании кода состояния ответа в первом параметре не является необходимым.