PHP редирект с переменными строки запроса HTTP - PullRequest
35 голосов
/ 16 января 2011

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

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

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

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

привет

Ответы [ 7 ]

83 голосов
/ 16 января 2011
<?php
    header("Status: 301 Moved Permanently");
    header("Location:./content/index.html?". $_SERVER['QUERY_STRING']);
    exit;
?>
10 голосов
/ 30 ноября 2015

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

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());
7 голосов
/ 25 июня 2014

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

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

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

Опция2. - Преимущества (+)

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

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

  • этот тип запроса здания может быть избыточным («бесполезным»), просто ненужным ...
  • если запрос большой (возможно, какая-то атака?), Он может иметьвлияет на производительность, потому что каждый раз будет массив, преобразованный в строку и закодированный

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

3 голосов
/ 16 января 2011

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

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

2 голосов
/ 16 января 2011

Во-первых, почему бы не перенаправить с переписать мод?

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

1 голос
/ 16 января 2011

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

1 голос
/ 16 января 2011

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

...