Вместо редиректа выдается промежуточная страница

Labutin

Новичок
Вместо редиректа выдается промежуточная страница

Вот пример: http://si-nn.ru/?id=15165
Вместо редиректа после
header("Location: ...");
apache почему-то выдает промежуточную страницу :( На других хостингах проблем не было. Локально воспроизвести проблему не удается. Хостер не признает проблему на своей стороне.
В чем может быть проблема? Куда копать?

Apache/2.0.54
PHP Version 5.2.6


P.S.
PHP:
header("HTTP/1.1 301 moved Permanently");
header("Location: [domain.com...]
пробовал - не помогает
 

fixxxer

К.О.
Партнер клуба
$ curl -D - 'http://si-nn.ru/?id=15165'
HTTP/1.1 200 OK
Date: Wed, 10 Mar 2010 20:06:50 GMT
Server: Apache/2.0.54
X-Powered-By: PHP/5.2.6
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=73de583e31dd8f329a711e146e8357f0; path=/
Set-Cookie: uuid=1480ad67a2fe6c248c5c9345ab7c1743; expires=Thu, 10-Mar-2011 20:06:50 GMT; path=/
Location: http://stroykomplekt-nn.ru
Vary: Accept-Encoding
Content-Length: 269
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>200 OK</title>
</head><body>
<h1>OK</h1>
<p>The document has moved <a href="http://stroykomplekt-nn.ru">here</a>.</p>
<hr>
<address>Apache/2.0.54 Server at si-nn.ru Port 80</address>
</body></html>

1) Попробуй вместо
header("HTTP/1.1 301 moved Permanently");
отдавать
header("Status: 301");

2) Вариант с явным HTTP/1.1 в любом случае некорректен - надо проверять версию используемого протокола, а в случае невозможности определения подразумевать HTTP/1.0.
 

fixxxer

К.О.
Партнер клуба
опа.

вот что значит писать на пхп 8 лет :D никогда бы не догадался, что это добавили туда.

Ваще дурная логика - как предполагается это использовать, если мне кроме как отдать статус, никакой еще заголовок не нужен? Лучше бы отдельную функцию сделали. Похапе, блин.
 

dimagolov

Новичок
Fortop, но там же еще и написано:
The second special case is the "Location:" header. Not only does it send this header back to the browser, but it also returns a REDIRECT (302) status code to the browser unless the 201 or a 3xx status code has already been set.
то есть Location: обязан устанавливать status code, а этого, похоже, не происходит. да и апач ведь с какой-то радости подсовывает html-ку, это явно не спроста, одних кривых заголовков для такого поведения должно быть недостаточно.
 

Fortop

Новичок
Fortop, но там же еще и написано
А я тут причем? :) Я просто указал на возможность установить заголовок.

то есть Location: обязан устанавливать status code
У меня он это и делает, если правильно и без ошибки указан
PHP:
header('Location: some.site.com');
А html'ка кстати странная... разве использовался где-то DTD во времена HTML 2.0?
 

Labutin

Новичок
Нашел косяк. Оказывается, что в закоулках кода вызывалось:
header("Status: 200 OK", true,200);
и в итоге вот такой код:
PHP:
header("Status: 200 OK", true,200);
header("Location: http://www.google.com/", true, 403);
приводит к соответствующей реакции apache.
Но что самое странное - на предыдущем хостинге такой промежуточной страницы не было!!! Был редирект.
Вот интересно - можно ли таким поведением apache управлять через его настройки?
 
Сверху