При использовании nginx / php-fpm заголовок местоположения иногда игнорируется браузером. Зачем? - PullRequest
1 голос
/ 11 ноября 2010

Я перевожу работающий веб-сайт apache / mod-php на nginx / php-fpm.

В Apache / mod-php я мог бы использовать header("Location: $url"); для перенаправления браузера на другую страницу, например, после попытки входа в систему. После переключения на nginx / php-fpm браузер больше не будет следовать этому перенаправлению на определенных страницах. Я подтвердил с помощью Firebug и Httpfox, что заголовок «Location: [url]» действительно был получен в ответе. Это поведение также появляется в Chrome (не проверено в IE).

Итак, я провел несколько экспериментов, прочитал несколько вещей о http и заставил его работать, но я не уверен, почему он работает (или почему нет).

Решением, которое я придумал, было отправить заголовок «Status: 303» перед заголовком «Location: [url]». Это работает в Chrome и Firefox, которые оба игнорировали заголовок Location, когда я отправлял «Status: 200», или опускали заголовок Status, но делали перенаправление, когда я менял его на «Status 303». Он работал с Status 200 под Apache.

Требуется ли заголовок Status для использования заголовка Location? Или Apache делал что-то еще, чтобы заставить это работать? Я не изменил ни один из задействованных php-кодов, кроме строки header("Status: 303");, которая заставила его работать. Здесь должно быть что-то еще, но я понятия не имею, что это может быть.

Есть идеи?

1 Ответ

2 голосов
/ 11 ноября 2010

Заголовок Location сам по себе не запускает браузер для перенаправления.Перенаправление фактически инициируется кодом ответа HTTP из серии 3xx. В w3c есть объяснения для всех кодов ответов http .

Apache автоматически видит заголовок Location в ответе и вынуждает код ответа быть 300-серии, если вы ранее не установилисобственный код ответа.Nginx этого не делает - он ожидает, что вы сами установили правильный код ответа.

Вы можете заставить php отправить измененный код ответа HTTP, например так:

<?php
  header("HTTP/1.0 301 Moved Permanently");
?>

... ТогдаКонечно, вам нужно быть уверенным, что вы все еще отправили заголовок Location 1014 * после отправки строки HTTP/1.0..., показанной выше.

...