2012-06-05 2 views
6

Я знаю, что это очень общий вопрос, но я не мог найти ответPHP редирект не изменяет URL

I'v post.php, что представить пост формы controller.php When он идет прямо в контроллер делает:

header("Location: ./post?ok=1"); 

пост фактически вставлен, и он проходит через линию выше, но адрес в браузере кажется, никогда не изменилась, и в конце концов есть не нормально param,

Я мог бы использовать переменную сеанса для хранения е такой успех/провал парам, но этот способ должен работать

Post.php:

<form action="controller" method="post"> 
    <input name="test" value='test' type="text" /> 
    <input type="submit" value="post" /> 
</form> 

controller.php:

<?php 
    header("Location: ./post?ok=1"); 
?> 

Edit 1:

header("Refresh:1;url=http://localhost/test/post?ok=1"); //doesn't work better 

Редактировать 2:

в Post.php сверху я положил

debug("post l ".count($_POST)); 
debug("get l ".count($_GET)); 

они показывают 0, прежде чем отправить, и 0 после того, как также

EDIT3: она работает

был заблокирован:

if ($success){ 
    header("Location: ./post?ok=1"); 
} 
header("Location: ./post"); 

что должны быть:

if ($success){ 
    header("Location: ./post?ok=1"); 
} else { 
    header("Location: ./post"); 
} 

ТНХ все

+1

Я думаю, что вы не дали ACTION тега формы правильно ... это должно быть что-то вроде

Вы пропустили расширение файла. –

+0

Вы уверены, что функция головы выполнена? – xdazz

+0

yes I'v поставил там отладку ('test') –

ответ

3

Прежде всего вы не должны использовать $_SERVER['HTTP_REFERER'] это небезопасно. Также возможно, что клиент все равно не отправит этот заголовок. Прямо сейчас я не знаю, как, но я уверен, что это можно было бы использовать, чтобы взломать ваш сайт за что-то злое.

Лучше вы должны знать, откуда пришли данные формы, и перенаправить туда пользователя.

Кстати, ваш перенаправление, возможно, не работает, как ожидалось, потому что URL-адрес уже содержит вопросительный знак. Поэтому вам нужно добавить дополнительные параметры с знаком &.

Для перенаправления я бы предложил HTTP-статус ответа 302 Found. Но вы должны быть уверены, что ничего другого не отправляют раньше. Там не должно быть никакого вывода HTML или пустые строки перед этой следующей header линии:

header("Location: http://".$_SERVER['HTTP_HOST']."/your/source.form", true, 302); 
+0

Я поставил заголовок («Местоположение: ./post?ok») ; и не работает лучше, отредактировал вопрос –

+0

В переадресациях лучше использовать полные URL-адреса релятивистских URL-адресов * bad * там браузер можно путать с исходным и целевым URL-адресом. На каком URL следует перенаправить перенаправление? – rekire

+0

Я пробовал либо заголовок («Местоположение: http: // localhost/test/post? Ok = 1»); и заголовок («Обновить: 0; url = http: // localhost/test/post? ok = 1»); пока не работает –

3

Попробуйте использовать код статуса HTTP 303 См OTER:

header("Location: your/location", true, 303); 
+0

К сожалению, это то же самое –

1

Там могут быть некоторые проблемы на стороне сервера (например, ваш код выдает что-то перед установкой заголовков). Чтобы отладить это, вам нужно установить display_errors = On в свой php.ini или временно включить его в вашем коде с помощью ini_set('display_errors', 1). В большинстве случаев ошибка "Cannot modify header information - headers already sent.". Убедитесь, что нет print, echo или любого белого пространства и дополнительные линии после того, как PHP закрывающего тега (?>)

+0

Я не получал эти ошибки, и контроллер не отзывался ни на один html или что-то еще, есть только некоторые вызовы php_curl и переадресация заголовка() –

1

Это может проблема второго перенаправления сервером.

header('Location: post.php?ok=1', true, 303); 
exit; 

Try, чтобы добавить расширение .php к URL, чтобы убедиться, что пост? ОК = 1 не перенаправляется Post.php сервером (например, Htaccess). В дополнительном перенаправлении вы можете потерять параметры get. Затем не забудьте добавить выход после перенаправления заголовка.

0

На самом деле ... похоже, вы не следуете вызову header() с «exit». Примеры:

header('location: ' . $location); exit; 

header('location: ' . $location, true, 301); exit; 

Когда вы «выход» после вызова URL изменяется в адресной строке браузера, так как код возможности продолжать выполнять. В противном случае код продолжает выполняться, что приводит к тому, что URL-адрес остается неизменным.

Смежные вопросы