Am o directivă RewriteRule în Apache pe care aș dori să o aplice numai dacă este prezent un antet HTTP personalizat.
Ce am incercat:
<If "%{HTTP:X-MyCustomHeader} in { 'present' }">
RewriteRule ^/$ /present.html [NC,R=301,L]
</If>
<Else>
RewriteRule ^/$ /absent.html [NC,R=301,L]
</Else>
Acest lucru nu funcționează deloc, nici RewriteRule nu este aplicat.
Alternativa pe care am incercat-o:
<If "-n req_novary('X-MyCustomHeader')">
Nici nu merge.
Testez cu curl like
curl -este http://example.com/ -H X-MyCustomHeader:prezent
Pentru a valida faptul că antetul este prezent și văzut, am încercat să folosesc o variabilă env:
SetEnvIf X-MyCustomHeader ^(prezent)$ MY_CUSTOM_VAR=$1
Antetul setat întotdeauna X-MyCustomHeader „### FOUND ###” env=MY_CUSTOM_VAR
Acest lucru funcționează conform așteptărilor și primesc FOUND în răspuns.
Dar, din nou, când încerc să folosesc variabila env în instrucțiunea IF, aceasta nu va fi declanșată, de ex.
<If "-n env('MY_CUSTOM_VAR')">
Cum pot face asta cu IF? Și da, știu că există o condiție RewriteCond pentru a verifica variabilele de mediu, dar trebuie să folosesc și alte directive, așa că aș dori să le schimb într-un bloc IF.
Conform documentelor: https://httpd.apache.org/docs/trunk/en/expr.html#functions
Când variabilele de mediu sunt căutate într-o condiție, este important să luați în considerare cât de devreme apare această rezoluție în procesarea cererii. Ca un ghid, orice directivă definită în afara contextului gazdei virtuale (director, locație, htaccess) nu este probabil să fi avut încă șansa de a fi executată. SetEnvIf în domeniul gazdă virtuală este o directivă care rulează înainte de această rezoluție.
Deci, conform documentelor, variabilele SetEnvIf ar trebui să funcționeze, dar nu?