Apache htaccess più condizioni di riscrittura per più regole
Ho rilevato un sito Web e ho notato che lo sviluppatore precedente aveva più .htaccessregole di riscrittura, questo è un breve esempio:
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$ RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$ RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^(.*)/landing/(.*)/(.*)$ landing.php?page=$1&id=$2&mid=$3
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$ RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$ RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^(.*)/landing/(.*)$ landing.php?page=$1&id=$2 RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$ RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$ RewriteRule ^(.*)/landing$ landing.php?page=$1
La condizione di riscrittura è sempre la stessa per tutte le regole, c'è un modo per combinare le regole di riscrittura in modo che le condizioni debbano essere scritte una sola volta?
Ho esaminato il flag di salto ma non è possibile alcun backreference. Per quanto vedo non ho bisogno di backreference con quelle condizioni, tuttavia, saltare l'approccio migliore? O esiste una best practice su come raggiungere questo obiettivo? (Qualcuno mi ha suggerito di utilizzare il flag QSA, tuttavia, durante la ricerca non penso che abbia nulla a che fare con ciò che voglio ottenere.)
Risposte
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$ RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$ RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$ RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
Questo disordinato blocco di condizioni viene iniettato automaticamente da cPanel prima di ogni RewriteRuledirettiva quando rinnova automaticamente un certificato di sicurezza SSL (Let's Encrypt?). Queste condizioni assicurano che il file di convalida (richiesto per rinnovare il certificato SSL) sia accessibile.
Sfortunatamente, non sono stato in grado di arrivare in fondo al motivo per cui cPanel lo fa in questo modo: può essere un incubo di manutenzione e ho riscontrato direttive che sono state infrante da queste condizioni (è vero che le direttive erano tutt'altro che perfette per cominciare ). (Ho provato a chiedere sui forum di cPanel, ma non ho mai avuto una buona risposta.)
... c'è un modo per combinare le regole di riscrittura in modo che le condizioni debbano essere scritte una sola volta?
Sì. Puoi spostare queste condizioni nel loro blocco all'inizio del .htaccessfile e invertirne il significato, quindi invece di attivare solo RewriteRulequando una richiesta non corrisponde al pattern (usando un'espressione regolare negata ). È possibile impedire ulteriori riscritture quando una richiesta corrisponde al modello. Per esempio:
# BEGIN cPanel SSL CERT RENEWAL
RewriteCond %{REQUEST_URI} ^/[0-9]+\..+\.cpaneldcv$ [OR] RewriteCond %{REQUEST_URI} ^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$ [OR]
RewriteCond %{REQUEST_URI} ^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$ [OR] RewriteCond %{REQUEST_URI} ^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^ - [L]
# END cPanel SSL CERT RENEWAL
Notare la rimozione del !prefisso (negazione) su CondPattern e il ORflag aggiuntivo sulle prime tre condizioni. L' RewriteRuleallora impedisce ulteriori direttive mod_rewrite in lavorazione deve partita richiesta.
(Su Apache 2.4.8+ queste direttive possono essere spostate interamente nella configurazione del server. Con l'aiuto di RewriteOptions InheritDownBefore.)
Quindi, seguito solo dalle RewriteRuledirettive che avevi prima (anche se ho aggiunto il Lflag):
RewriteRule ^(.*)/landing/(.*)/(.*)$ landing.php?page=$1&id=$2&mid=$3 [L]
RewriteRule ^(.*)/landing/(.*)$ landing.php?page=$1&id=$2 [L] RewriteRule ^(.*)/landing$ landing.php?page=$1 [L]
Probabilmente dovresti includere Lflag su quelle rimanenti riscritture.
Puoi anche combinare queste 3 riscritture in un'unica direttiva, se lo desideri, ma ciò dipenderà se la tua applicazione gestisce parametri URL vuoti.
(Qualcuno mi ha suggerito di utilizzare il flag QSA, tuttavia, durante la ricerca non penso che abbia nulla a che fare con ciò che voglio ottenere.)
Sì, questo non ha davvero nulla a che fare con questo particolare problema. Il QSAflag (Query String Append) consente di unire qualsiasi stringa di query presente sulla richiesta con la stringa di query che si sta scrivendo nella RewriteRule sostituzione .