2011-01-15 13 views
30

atm Używam następujące cztery linie przekierować użytkownika do innej strony na mojej stronie internetowej:php przekierowanie z zapytań HTTP zmiennych łańcuchowych

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

ale nie ma problemu z wykorzystaniem zapytań HTTP zmiennych łańcuchowych jak http://<url>?param=blah
nie są one dołączane do adresu URL w sposób zrozumiały.

Czy istnieje sprytne posunięcie do wdrożenia tego?

pozdrowienia

+1

Uważam, że należy użyć w pełni qualifiedly uri więc spróbuj 'http: //domain.tld/path? get = params' zamiast'/path? get = params', w przeciwnym razie możesz utworzyć stronę docelową z elementem przekierowania meta. – RobertPitt

+0

Jaki jest dokładnie problem? Istnieje kilka możliwych interpretacji. –

+0

Przykro mi, że to był http: //domena.tld/ścieżka = params – Graslandpinguin

Odpowiedz

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

Czy to jest bezpieczne? Czy musimy zakodować łańcuch zapytania w jakikolwiek sposób? – Achshar

+2

Aby uniknąć ryzyka ataków XSS, rozsądnie byłoby zdezynfekować $ _SERVER ['QUERY_STRING'] za pomocą htmlspecialchars() – nfrost21

+1

@ nfrost21, to nie zadziała, jeśli masz więcej niż jeden parametr, ponieważ htmlspecialchars() koduje & ogranicznik i łamie parametry. – jamesthollowell

1

Dodać $_SERVER['REQUEST_URI'] lub QUERY_STRING. Wykonaj numer print_r($_SERVER);, aby uzyskać więcej informacji o żądanym adresie URL.

3

Używanie $_SERVER['QUERY_STRING'] i dołączanie go do końca przekierowania może być tym, czego szukasz.

EDYCJA: Właśnie zauważyłem, że trochę się spóźniłem z moją odpowiedzią.

2

Po pierwsze dlaczego nie przekierować z mod przepisać?

Ale tak czy inaczej, można Concat $ _SERVER [ „QUERY_STRING”] na końcu adresu URL

+0

Znajduję mod_rewrite jest naprawdę trudne do przekierowania ciągi kwerendy, chyba że wiesz, co będą z góry. Albo to, albo wynik wyszukiwania w Google overcomplicate rzeczy. – ryanwinchester

+1

@decker Myślę, że znalezione wyniki wyszukiwania w Google są nadmiernie komplikowane. Zasadniczo nie różni się to od zaakceptowanej odpowiedzi. Z wyjątkiem mod_rewrite zamiast php. –

1

Chciałbym również zasugerować użycie mod_rewrite do tego zadania, może być bardziej elastyczny.

+0

Dzięki za podanie łącza do dokumentacji! – Impulss

6

chciałbym dodać jeszcze jedną opcję ...
Anyways - jak mówili inni, stosując (.htaccess) mod_rewrite prawdopodobnie byłby najlepszym rozwiązaniem.

Jednak
tam na pewno może być wiele sytuacji, kiedy trzeba to zrobić w PHP => masz 2 opcje:

  1. dopisywać swoje przekierowania URI z $_SERVER['QUERY_STRING']
  2. Dołącz swój przekierowanie URI z zapytania zbudowany na własną rękę: http_build_query($_GET);

Opcja 2.- Zalety (+)

  • Koduje parametrów (domyślnie przez PHP_QUERY_RFC1738)
  • można łatwo dodać (lub usunąć) niektóre $_GET params jak:
    $_GET['new_param']="new value"; (ADD)
    unset($_GET['param_to_remove']); (usuń)
  • jeśli środowisko (niech Bóg wie dlaczego) nie dostarcza QUERY_STRING - prawdopodobnie nadal możesz uzyskać superglobalne $_GET => ekologiczną niezależność
  • http_build_query() „s 1-szy param rzeczywistości może być dowolną tablicę lub obiekt, dzięki czemu można zbudować żądania $_GET -jak od $_POST lub $o = new YourObject(); razie potrzeby
  • można zmienić separator argumentów, jeśli to konieczne

Opcja 2. - Dissadvantages (-)

  • tego rodzaju zapytania budynku może być zbędny ("good-for-nothing"), po prostu niepotrzebne ...
  • Jeśli zapytanie jest duży enaugh może to mieć wpływ na performance, ponieważ za każdym razem będzie tablicą konwertowane na ciąg & kodowanego

Więcej informacji można znaleźć http://www.php.net/manual/en/function.http-build-query.php (może jakiś atak?) - strony podręcznika PHP o funkcji http_build_query() który Returns a URL-encoded string.

7

zrobić przekierowanie i upewnij się dodatkowy znak zapytania nie pojawi się, gdy ciąg kwerendy nie jest przekazywana użyć następujących

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()); 
Powiązane problemy