Подтвердить что ты не робот

PHP-перенаправление с переменными строки запроса HTTP

atm Я использую следующие четыре строки, чтобы перенаправить пользователя на другую страницу на моем веб-сайте:

<?php
    header("Status: 301 Moved Permanently");
    header("Location: ./content/index.html");
    exit;
?>

но есть проблема с использованием переменных строки запроса HTTP, таких как http://< url >?param=blah
они не присоединяются к URL-адресу понятным образом.

Есть ли разумный ход для реализации этого?

привет

4b9b3361

Ответ 1

<?php
    header("Status: 301 Moved Permanently");
    header("Location:./content/index.html?". $_SERVER['QUERY_STRING']);
    exit;
?>

Ответ 2

Чтобы сделать перенаправление и убедитесь, что дополнительный вопросительный знак не отображается, когда строка запроса не передается, используйте следующий

function preserve_qs() {
    if (empty($_SERVER['QUERY_STRING']) && strpos($_SERVER['REQUEST_URI'], "?") === false) {
        return "";
    }
    return "?" . $_SERVER['QUERY_STRING'];
}
header("Status: 301 Moved Permanently");
header("Location: ./content/index.html" . preserve_qs());

Ответ 3

Я хотел бы добавить еще один вариант...
Anyways - как и другие, сказал, что использование (.htaccess) mod_rewrite, вероятно, будет лучшим вариантом.

Однако, конечно, может быть много ситуаций, когда вам нужно это делать в PHP = > у вас есть 2 варианта:

  • Добавьте свой URI перенаправления с помощью $_SERVER['QUERY_STRING']
  • Добавьте свой URI перенаправления с запросом, созданным самостоятельно: http_build_query($_GET);

Вариант 2. - Преимущества (+)

  • Кодирует параметры (по умолчанию - PHP_QUERY_RFC1738)
  • вы можете легко добавить (или удалить) некоторые параметры $_GET вроде:
    $_GET['new_param']="new value"; (добавить)
    unset($_GET['param_to_remove']); (удалить)
  • Если среда (бог знает почему) не предоставляет QUERY_STRING - вы, вероятно, все еще можете получить суперглобальное $_GET = > независимое от окружающей среды
  • http_build_query() 1-й параметр может фактически быть ЛЮБЫМ массивом или объектом, поэтому вы можете построить $_GET -подобный запрос от $_POST или $o = new YourObject(); при необходимости
  • при необходимости можно изменить разделитель аргументов

Вариант 2. - Недостатки (-)

  • такой запрос здания может быть избыточным ( "ничего не значащий" ), просто ненужным...
  • Если запрос большой enaugh (возможно, некоторая атака?), он может повлиять на производительность, потому что каждый раз будет преобразован массив в строку и закодирован

Подробнее см. http://www.php.net/manual/en/function.http-build-query.php - справочный сайт PHP о функции http_build_query(), которая Returns a URL-encoded string.

Ответ 4

Использование $_SERVER['QUERY_STRING'] и добавление его в конец вашего перенаправления может быть тем, что вы ищете.

РЕДАКТИРОВАТЬ: Только что я немного опоздал с ответом.

Ответ 5

Во-первых, почему бы не перенаправлять с помощью mod rewrite?

Но в любом случае вы можете выполнить $_SERVER ['QUERY_STRING'] до конца вашего URL

Ответ 6

Добавьте $_SERVER['REQUEST_URI'] или QUERY_STRING. Сделайте print_r($_SERVER);, чтобы увидеть дополнительную информацию о запрошенном URL.

Ответ 7

Я также предложил бы использовать mod_rewrite для этой задачи, вы можете быть более гибкими.