Come utilizzare ErrorDocument per reindirizzare a un file php nella stessa cartella?
-
13-09-2019 - |
Domanda
Voglio prendere le richieste di file mancanti in una cartella specifica e li reindirizza a program.php in quella cartella.
Questo è un programma userò molto in posti diversi, e io preferirei evitare di specificare il nome della cartella nel file .htaccess.
Ho provato solo mettendo:
errordocument 404 program.php
, ma il risultato è che il browser solo viene stampato "program.php" e non esegue program.php.
Capisco perché questo sta accadendo: sulla base della documentazione all'indirizzo http://httpd.apache.org/docs/2.0/mod/core.html , di URL che non inizia con una barra o http sono interpretate come un messaggio di testo.
La domanda è: come aggirare questa limitazione di essere in grado di accedere alla stessa cartella.
Soluzione
Ho finito per usare RewriteRule invece di ErrorDocument :
rewriteengine on rewritecond %{request_filename} !-f rewriterule ^(.+).jpg$ program.php?i=$1.jpg [L]
La seconda riga verifica che il file non esiste, in modo che le immagini esistenti verranno visualizzati correttamente.
Altri suggerimenti
Si desidera:
ErrorDocument 404 /program.php
Secondo il docs , "URL possono iniziare con una barra (/) per il web-percorsi locali (relativi alla DocumentRoot) ".
Hai provato un percorso (relativo o assoluto)? Se si rendono relativo, dovrebbe essere alla radice web, quale server il vostro scopo potenza.
ErrorDocument 404 /program.php
Se avete solo un piccolo numero di cartelle, probabilmente si può utilizzare:
<Directory /path/a>
ErrorDocument 404 /a/program.php
</Directory>
<Directory /path/b>
ErrorDocument 404 /b/program.php
</Directory>
<Directory /path/c>
ErrorDocument 404 /c/program.php
</Directory>
Se questo è poco pratico, allora si dovrebbe avere un solo program.php nella radice e lo hanno rispondere in modo diverso a seconda del contenuto della variabile d'ambiente REDIRECT_URL, che è di $ _SERVER [ 'REDIRECT_URL'] in php.
Perché non hanno un'ErrorDocument gestire tutti gli errori in tutte le cartelle? Potrebbe essere molto più pulito in questo modo. È quindi possibile gestire il singolo caso con $ _SERVER [ "REQUEST_URI"] che dovrebbe contenere la richiesta originale, se non ricordo male.
Come su questo. Nel vostro percorso principale, è possibile impostare un file error.php generico. Tuttavia, tutto ciò che fa è analizzare il REQUEST_URI, controllare il percorso, vedere se c'è un error.php abitudine là, e comprendono che. Potrebbe funzionare, eh?