Один php скрипт: nginx возвращает 200, apache - 302

175
08 июля 2018, 01:30

Имеем следующий код:

<?php
header("Status: 200 OK");
header("Location: http://google.com");
var_dump(http_response_code());

Тестовая среда для запуска (docker-compose только для примера, если вам удобнее можно и без него, но результат идентичный): https://github.com/Mapteg34/nginx200_when_apache302

mapt@mpc test % curl -v 127.0.0.1:6091/test.php
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 6091 (#0)
> GET /test.php HTTP/1.1
> Host: 127.0.0.1:6091
> User-Agent: curl/7.58.0
> Accept: */*
> 
< HTTP/1.1 302 Found
< Date: Sat, 09 Jun 2018 12:18:03 GMT
< Server: Apache/2.4.25 (Debian)
< X-Powered-By: PHP/5.6.36
< Status: 200 OK
< Location: http://google.com
< Content-Length: 9
< Content-Type: text/html; charset=UTF-8
< 
int(302)
* Connection #0 to host 127.0.0.1 left intact

mapt@mpc test % curl -v 127.0.0.1:6092/test.php
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 6092 (#0)
> GET /test.php HTTP/1.1
> Host: 127.0.0.1:6092
> User-Agent: curl/7.58.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Server: nginx/1.13.7
< Date: Sat, 09 Jun 2018 12:18:08 GMT
< Content-Type: text/html; charset=UTF-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< X-Powered-By: PHP/5.6.36
< Location: http://google.com
< 
int(302)
* Connection #0 to host 127.0.0.1 left intact

В итоге получаем проблему (или все-таки что-то некорректно настроено?): apache возвращает 302 (и в целом это правильно), nginx возвращает 200 и location (и это не корректно).

Есть идеи как исправить это и заставить nginx (nginx.conf) возвращать на этом коде логичный 302, так же как апач (и это не проблема fpm, если посмотреть его логин он тоже отдает 302)?

Я понимая что пример наверное из разряда "сам проблему создал...". Но в реальности первую строчку (Status: 200 OK) выставляет CMS и я не могу это изменить. А дальше (Location: http://google.com) это уже мой код. Конечно я могу его поменять, например установив предварительно свой статус, или сделав header_remove(), но работать будет в данном месте, а есть другие модули, есть в конце концов части CMS, использующие ту же конструкцию. Все их поменять не получится (да и нельзя). Однако на Apache оно вполне работает и надо заставить его работать в рамках nginx.

READ ALSO
Неправильно обрабатывается запрос mysql на php

Неправильно обрабатывается запрос mysql на php

Пытаюсь сделать запрос в БД на php, но опыт в языке стремится к нулюЗапрос не выполняется верно, хотя callback пишет, что все ок

193
Циклы без фигурных скобок в php

Циклы без фигурных скобок в php

Подскажите пожалуйста, как можно записать подобный цикл, без использования фигурных скобок?

170
Прибавлять ID при отправке с формы

Прибавлять ID при отправке с формы

Подскажите как сделать чтобы при отправке с формы постоянно прибавлялся идентификатор 'id' в бд у меня поле id INT а все остальные text

184
Как очистить линейный массив на PHP?

Как очистить линейный массив на PHP?

Маюсь парсингом, но в результате мне удалось получить массив только с нужными мне значениями (кириллица)Всё остальное - пустые значения

219