2012-05-01 11 views
6

Questa domanda è in qualche modo correlata al mio previous question. Il trucco dell'uso di $_SERVER['REDIRECT_QUERY_STRING'] sembra funzionare solo per le variabili $_GET.

Bene, ho un file index.php che gestisce tutti gli 404 redirects.

Se un utente richiede una pagina di cui doesnt esistere, ad esempio, apple.php?item=23, quindi utilizzando $_SERVER['REDIRECT_QUERY_STRING'] posso ottenere la variabile $_GETitem=23, ma se la variabile non $_GET ma $_POST è poi $_SERVER['REDIRECT_QUERY_STRING'] non funziona.

Come posso ottenere $_POST variabile quando ho destinarli a index.php usando l'impostazione

ErrorDocument 404 /index.php

+1

Non è un "trucco", è solo una soluzione terribile. Perché non usare 'mod_rewrite'? ps: no, dopo il reindirizzamento 404 hai già perso i dati dei post e non riesci a ottenerlo – zerkms

+0

non sono sicuro, ma penso che perderai tutti i dati POST durante il reindirizzamento. a cosa ti serve? forse c'è un modo diverso – miro

+0

Si noti che non esiste un "reindirizzamento 404". I codici di risposta 4xx indicano un errore del client (404 indica che la risorsa richiesta dal client non esiste sul server), i codici 3xx sono per il reindirizzamento.Se si desidera forzare un client a reinviare e una richiesta POST identica a un nuovo URI, è necessario utilizzare un codice di stato 307. Ma sospetto che ciò che devi effettivamente usare qui sia 'RewriteCond% {REQUEST_FILENAME}! -f' e' RewriteCond% {REQUEST_FILENAME}! -d' per riscrivere le richieste di file che non esistono in uno specifico script. – DaveRandom

risposta

7

Controllare risposta qui: http://www.brainonfire.net/blog/apache-pitfall-errordocument-post/

ho risolto il mio problema con questo.


o mettere questo nel vostro file .htaccess:

 

    RewriteEngine On 
    RewriteBase/


    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule . /yourErrorDocument.php [L] 

+0

Non ho funzionato - entrambi $ _SERVER ['REQUEST_METHOD'] e $ _POST mancano (php 5.4.12) –

5

Con la seguente direttiva il seguente .htaccess:

ErrorDocument 404 /index.php 

il server web Apache esegue un reindirizzamento interno alla nuova posizione. Mezzi interni, il client (browser) non modificherà l'URL nella sua barra degli indirizzi perché tale reindirizzamento non è comunicato al browser.

Poiché si tratta di un reindirizzamento, la richiesta POST viene trasformata in una richiesta GET.

si può vedere questo, cercando nelle seguenti due $_SERVER variabili:

$_SERVER['REDIRECT_REQUEST_METHOD'] # POST 
$_SERVER['REQUEST_METHOD'] # GET 

Così, in breve, non è possibile utilizzare il ErrorDocument directive per fare la riscrittura degli URL per le richieste HTTP POST.

Per questo è necessario utilizzare lo mod_rewrite module o creare il proprio gestore di apache.

+0

Grazie, ho risolto il problema con l'aiuto dell'idea di DaveRandom :) Sempre, grazie anche a te per l'aiuto :) –

+0

Questo è il modo più semplice per andare se non hai bisogno di ottenere i dati del post. –

+2

@JackFranzen: Oh, c'è anche la direttiva [** 'FallbackResource' **] (https://httpd.apache.org/docs/current/mod/mod_dir.html#fallbackresource) che non ha il POST limitazioni come discusso in questa risposta. Vedi anche http://stackoverflow.com/a/8196767/367456 e http://stackoverflow.com/a/7968869/367456 dove l'ho trattato in precedenza. – hakre

2

Utilizzare la direttiva FallbackResource invece della direttiva ErrorDocument di Apache: si fa il trucco FallbackResource on Apache website

Esempio:

FallbackResource /404.php 
+0

Questa è la soluzione che ha funzionato per ciò di cui avevo bisogno. Grazie per averlo fornito. Una nota importante per coloro che implementano questa soluzione: dovrai specificare il file vero e proprio per nome. Ad esempio, nel mio progetto avevo precedentemente "ErrorDocument 403/router /" come mia direttiva senza specificare "index.php" alla fine. Quando ho provato "FallbackResource/router /" non è riuscito fino a quando non l'ho cambiato in "FallbackResource /router/index.php". –

+0

Vedere anche questo post che dovrebbe risparmiare un'ora di tempo cercando di eseguire il debug perché non funziona per l'endpoint radice di "/": https://serverfault.com/questions/512735/fallbackresource-directive-works- per-ogni-uri-eccezione –

Problemi correlati