2011-01-15 21 views
30

atm sto usando le seguenti quattro righe per reindirizzare l'utente a un'altra pagina sul mio sito:php redirect con le variabili stringa di query HTTP

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

ma c'è un problema con l'uso di variabili stringa di query HTTP come http://<url>?param=blah
non vengono aggiunti all'URL comprensibilmente.

C'è una mossa intelligente per l'implementazione di questo?

saluti

+1

credo che si dovrebbe usare una completamente qualifiedly uriquindi prova 'http: //domain.tld/path? get = params' invece di'/path? get = params', altrimenti potresti dover creare una pagina di destinazione con l'elemento meta reindirizzamento. – RobertPitt

+0

Qual è il problema esattamente? Esistono diverse possibili interpretazioni –

+0

I # m scusate se si trattava di un http: //domain.tld/path? Get = params – Graslandpinguin

risposta

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

È sicuro? Abbiamo bisogno di codificare la stringa di query in alcun modo? – Achshar

+2

Per evitare il rischio di attacchi XSS sarebbe saggio disinfettare $ _SERVER ['QUERY_STRING'] con htmlspecialchars() – nfrost21

+1

@ nfrost21, sfortunatamente questo non funzionerà se si dispone di più di un parametro, poiché htmlspecialchars() codifica il & delimitatore e rompe i parametri. – jamesthollowell

1

Aggiungere il $_SERVER['REQUEST_URI'] o QUERY_STRING. Fai un print_r($_SERVER); per visualizzare ulteriori informazioni sull'URL richiesto.

3

Utilizzare $_SERVER['QUERY_STRING'] e aggiungerlo alla fine del reindirizzamento potrebbe essere quello che stai cercando.

MODIFICA: Ho appena notato che ero un po 'in ritardo con la mia risposta.

2

Prima di tutto perché non reindirizzare con riscrittura mod?

Ma in ogni modo, è possibile concat $ _SERVER [ 'QUERY_STRING'] alla fine dell'URL

+0

Sto cercando mod_rewrite è davvero difficile reindirizzare le stringhe di query a meno che tu non sappia cosa saranno in anticipo. O quello o risultati nella ricerca di google complicano le cose. – ryanwinchester

+1

@decker Penso che i risultati di google che hai trovato stiano complicando le cose. In linea di principio non è diverso dalla risposta accettata. Tranne con mod_rewrite invece di php. –

1

Vorrei anche suggerire di utilizzare mod_rewrite per questo compito, si può essere più flessibile.

+0

Grazie per aver fornito un collegamento alla documentazione! – Impulss

6

Vorrei aggiungere un altro opzione ...
In ogni modo - come altri hanno detto, usando (.htaccess) mod_rewrite sarebbe probabilmente l'opzione migliore.

Tuttavia,
sicuramente ci possono essere molte situazioni in cui si deve farlo in PHP => hai 2 opzioni:

  1. accodare il tuo reindirizzamento URI con $_SERVER['QUERY_STRING']
  2. Aggiunge il tuo reindirizzamento URI con una query costruito sul proprio: http_build_query($_GET);

Opzione 2.- Vantaggi (+)

  • codifica i parametri (default PHP_QUERY_RFC1738)
  • si può facilmente aggiungere (o rimuovere) alcuni $_GET params come:
    $_GET['new_param']="new value"; (aggiungere)
    unset($_GET['param_to_remove']); (rimuovere)
  • se l'ambiente (chissà perché) non fornisce un QUERY_STRING - probabilmente sei ancora in grado di ottenere il superglobale $_GET => indipendente dall'ambiente
  • http_build_query() 's primo param può effettivamente essere qualsiasi array o un oggetto in modo da poter costruire una richiesta $_GET -come da $_POST o $o = new YourObject(); se necessario
  • è possibile modificare il separatore argomento, se necessario

Opzione 2. - Dissadvantages (-)

  • questo tipo di interrogazione edificio potrebbe essere ridondante ("buono a nulla"), semplicemente inutile ...
  • se la query è grande enaugh potrebbe avere un effetto sulla performace, perché ogni volta che ci sarà un allineamento convertito in una stringa & codificata

Per maggiori informazioni visita http://www.php.net/manual/en/function.http-build-query.php (magari un po 'attacco?) - il sito di un manuale di PHP sulla funzione http_build_query() che Returns a URL-encoded string.

7

per fare il reindirizzamento e assicurarsi un punto di domanda in più non si presenta l'uso quando stringa di query non viene passato il seguente

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()); 
Problemi correlati