htaccess rewrite non funziona per tutte le regole
-
06-07-2019 - |
Domanda
Questo è un problema molto strano e spero solo di poterlo spiegare chiaramente.
Fondamentalmente, abbiamo effettuato un importante aggiornamento su un sito client oggi e dovevamo aggiornare alcune regole di riscrittura in htaccess per soddisfare la nuova struttura, ecc ...
Quindi, dove inizialmente avevamo cose come:
RewriteRule ^/resources/?$ index.php?id=resources
RewriteRule ^/media/?$ media.php
Siamo passati a:
RewriteRule ^/resources/?$ index.php?id=resources
RewriteRule ^/media/?$ index.php?id=media
Ma quando abbiamo visitato http://www.example.com/media - veniva visualizzato la vecchia pagina multimediale. Quindi, quando abbiamo rimosso il vecchio media.php dalla radice del documento, abbiamo ottenuto 404s. Qualcosa da qualche parte sta ancora mappando / media su media.php - e ignorando la regola di riscrittura.
La cosa strana è che - tutte le altre regole di riscrittura nel file funzionano bene - e ci sono circa 20 in là.
Abbiamo rintracciato su e giù il vhost e altri file di configurazione, ma non siamo riusciti a trovare alcun riferimento ai media o agli altri reindirizzamenti non funzionanti (tre in totale), quindi siamo sconcertati.
Soluzione 2
La disabilitazione dell'opzione MultiViews nel sito .htaccess ha risolto il problema - sembrava che questo consentisse la negoziazione dei contenuti che era in fase di elaborazione prima delle regole di riscrittura.
Altri suggerimenti
Sospetto fortemente che ciò sia dovuto a AcceptPathInfo, che a mio avviso è una funzionalità errata di Apache. Per impostazione predefinita, credo che sia attivato dove PHP è il gestore
Prova ad aggiungere al tuo .htaccess, o preferibilmente al tuo httpd.conf (e riavvia):
AcceptPathInfo Off
Vedi: http://httpd.apache.org/docs /2.2/mod/core.html#acceptpathinfo
-
Alcuni punti laterali:
Dovresti assicurarti che RewriteRules finisca sempre con [L] quando hai trovato una corrispondenza - ti aiuterà nel debug. Per esempio:.
RewriteRule ^/media/?$ index.php?id=media [L]
Inoltre, potresti ridurre il numero di regole combinando regole simili; per esempio:.
RewriteRule ^/(media|resources)/?$ index.php?id=$1 [L]
Personalmente penso che l'uso di /? alla fine del primo semestre non va bene, perché significa che entrambi gli URL funzionano, senza reindirizzamento, il che significa che non ne hai uno definitivo "corretto". Personalmente userei:
RewriteRule ^/(media|resources)/$ index.php?id=$1 [L]
RewriteRule ^/(media|resources)$ /$1/ [L,R]
In altre parole, una risorsa unica dovrebbe avere un singolo URL (definitivo) canonico.