Открытие страницы с использованием заголовка PHP со случайным идентификатором работает в Edge, но не в Chrome

Я пытаюсь сгенерировать случайное число (от 1 до 151), чтобы открыть страницу на основе случайно сгенерированного идентификатора. Проблема здесь связана с совместимостью браузера, поскольку предполагаемая функциональность работает в Edge, но не в Chrome или FireFox.

pokedex.php:

<form action='randomPokemon.php' >
    <button type="submit" class="toolsBtn">Random</button>
</form>

случайный покемон.php:

<?php
$host  = $_SERVER['HTTP_HOST'];
$uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$extra = 'pokedex.php?pid=';
$randomid = rand(1, 151);
header("HTTP/1.1 303 See Other");
header("Location: http://$host$uri/$extra" . mt_rand(1, 151));
unset($randomid);
exit;
?>

Демонстрация в реальном времени по адресу: http://fraserprovan.co.uk/projects/pokedex/pokedex.php

Я понятия не имею, почему это работает в Microsoft Edge, но не в других браузерах. В хроме каждый раз открывается одна и та же страница, как будто переменная $randomid не меняется. Будем очень признательны за любые советы или ссылки на другие ресурсы.

ОБНОВЛЕНИЕ: решил сделать это на Javascript вместо использования следующей функции. Спасибо за предложения.

function randomPokemon(){
    var randomNum = Math.floor(Math.random() * 151) + 1;  
    document.location.replace('pokedex.php?pid=' + randomNum);
}

person Fraser    schedule 23.06.2018    source источник
comment
Когда я пробую это в Chrome и Firefox, получаю тот же результат, что и вы. Действительно очень странно.   -  person Mr Glass    schedule 24.06.2018
comment
Я не знаю, в чем разница в использовании его в крае, я чешу голову.   -  person Fraser    schedule 24.06.2018
comment
При вызове randomPokemon.php URL-адрес меняется на pokedex.php, как и ожидалось. Это происходит, даже если я вставляю URL-адрес с randomPokemon.php.   -  person Mr Glass    schedule 24.06.2018
comment
Вы пытались регистрировать сгенерированные случайные числа, чтобы убедиться, что в PHP нет ничего странного? Я становлюсь странным, но очень воспроизводимым поведением. Я всегда получаю #82, когда нажимаю Random, но я всегда получаю #39, если я захожу на страницу из консоли, используя location.href = "http://fraserprovan.co.uk/projects/pokedex/randomPokemon.php".   -  person Mr Glass    schedule 24.06.2018
comment
Как бы вы порекомендовали вести журнал? Я знаю, как писать в консоль на javascript, но не на php   -  person Fraser    schedule 24.06.2018
comment
Его кеш. См. Перенаправление без кэширования   -  person SirPilan    schedule 24.06.2018
comment
@Pilan смотрите исходный пост для обновленного кода. Итак, я просмотрел то, что вы прислали, но обнаружил, что за этим довольно трудно следить. Я нашел этот пост о 303 перенаправлениях: stackoverflow.com/questions/13640109/ Теперь я получаю это в инструментах chrome dev для скрипта: 303 См. Другое (из кеша диска), но из кеша диска появляется только во второй раз кнопка нажимается. Вы не видите ничего плохого в том, как я это реализовал?   -  person Fraser    schedule 24.06.2018
comment
@Fraser пытался header('Expires: Sun, 01 Jan 2014 00:00:00 GMT'); header('Cache-Control: no-store, no-cache, must-revalidate'); header('Cache-Control: post-check=0, pre-check=0', FALSE); header('Pragma: no-cache'); ?   -  person SirPilan    schedule 24.06.2018


Ответы (1)


Вместо этого попробуйте использовать абсолютный URI, а также не оставляйте пробелов или новой строки перед оператором заголовка. См. это примечание из php-docs

Примечание:

Большинство современных клиентов принимают относительные URI в качестве аргумента для » Location:, но некоторым более старым клиентам требуется абсолютный URI, включая схему, имя хоста и абсолютный путь. Обычно вы можете использовать $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF'] и dirname(), чтобы самостоятельно создать абсолютный URI из относительного:

<?php
/* Redirect to a different page in the current directory that was requested */
$host  = $_SERVER['HTTP_HOST'];
$uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$extra = 'mypage.php';
header("Location: http://$host$uri/$extra");
exit;
?>
person Jehad Nasser    schedule 23.06.2018
comment
Я обновил код randomPokemon.php:. Спасибо за совет. Я обновил исходный пост с обновленным кодом. К сожалению, такая же ошибка происходит. - person Fraser; 24.06.2018
comment
Попробуйте следующее: header(Расположение: http://$host$uri/$extra .mt_rand(1, 151)); вместо $randomid = rand(1, 151); если это не сработало, попробуйте использовать фиксированный номер и держите меня в курсе. - person Jehad Nasser; 24.06.2018
comment
Обновил эту строку кода, та же проблема. Другой пользователь упомянул кэширование, я просто пытаюсь понять, как оно работает. Может быть проблема. - person Fraser; 24.06.2018
comment
Я вижу, теперь он работает на хроме, как вы это исправили? - person Jehad Nasser; 24.06.2018