2017-10-10 4 views
1

J'essaie d'écrire une règle de réécriture dans mon .htaccess qui redirige tout le trafic sauf un domaine vers https. Ensuite, si le fichier auquel il essaie d'accéder n'existe pas, exécutez le dernier bloc suivant, en allant à loader.php, mais si le fichier existe, allez-y.htaccess règle de réécriture si le fichier existe ailleurs aller au fichier PHP

est ici une des itérations j'ai jusqu'à présent:

RewriteEngine on 
RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} !^(www\.)?(korle\.tt) [NC] 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301] 
<If "-f %{DOCUMENT_ROOT} . '/'"> 
    RewriteEngine On 
    RewriteBase/
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^.*$ /loader.php [L] 
</If> 
<Else> 
    RewriteEngine On 
    RewriteRule^/404.html [R=404,L] 
</Else> 

Ce que je suis en train de faire est si l'utilisateur va korlett.org ou korlett.net ou korelett.com ou tout fichier, il redirige vers https://. Mais pas http://korle.tt ou d'autres domaines pointant vers ce répertoire (pour l'instant non spécifié), ils resteront HTTP.

Après cela, si le fichier n'existe pas ou si l'URL retourne une 404 puis exécutez ceci:

RewriteEngine On 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^.*$ /loader.php [L] 
+1

Que fait le ' tadman

+0

@tadman Je le pensais, mais quelqu'un m'a recommandé de le faire pour vérifier si le fichier renvoie un 404/non trouvé. Mais quand j'essaie de valider le fichier, il dit que ce n'est pas une syntaxe valide (à la If). Donc je suppose que cela n'a pas d'importance si cela fonctionne. Aucune suggestion? – wordSmith

+1

La directive 'RewriteCond' est une sorte de' if' en soi. L'autre truc est juste dans le chemin ici. – tadman

Répondre

1

alors sinon envoyé à loader.php pour vérifier s'il y a une longue L'url est associée à ce fragment/"dir" et si cela échoue, servez une page 404.

Cette réponse 404 doit être gérée par loader.php - ie. dans votre script PHP. Une fois que la demande a été transmise à loader.php (toute demande qui ne correspond pas à un fichier ou un répertoire), alors .htaccess a effectivement terminé avec la demande et vous ne pouvez plus obtenir Apache pour gérer la réponse 404.

Il devrait servir 404 si loader.php ne se trouve pas

Cependant, cela peut en effet être géré .htaccess, en définissant un ErrorDocument et en supprimant le préfixe slash sur la substitution RewriteRule (ce qui était probablement l'intention de toute façon, puisque vous avez inclus une directive RewriteBase). La suppression du préfixe de barre oblique empêche une boucle de réécriture (de réécrire plusieurs fois à loader.php). En d'autres termes, au lieu de cela:

RewriteRule ^.*$ /loader.php [L] 

Il devrait être ceci:

RewriteRule^loader.php [L] 

Le regex ^ a le même résultat net ^.*$ dans cet exemple, et sert simplement de faire correspondre quoi que ce soit (comme vous avez dans votre redirection HTTP vers HTTPS).

Cela empêche une boucle de réécriture car lors de la réécriture à loader.php (chemin relatif, pas de préfixe de barre oblique), le moteur de réécriture détecte que vous réécrivez sur la même URL et empêche d'autres réécritures. Permettre à l'Apache 404 ErrorDocument d'être servi. (Alors que /loader.php est techniquement une URL différente - en ce qui concerne mod_rewrite - de sorte que la réécriture continuerait.)

Ainsi, votre fichier complet .htaccess devient:

ErrorDocument 404 /404.html 

RewriteEngine on 
RewriteBase/

RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} !^(www\.)?(korle\.tt) [NC] 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule^loader.php [L] 

Une autre façon d'éviter une boucle de réécriture est d'inclure une exception pour loader.php. En fait, cela peut être utilisé avec ce qui précède, afin de faire échouer la réécriture au début, plutôt que d'attendre que le moteur de réécriture détecte le non-changement. Par exemple, modifiez le dernier bloc ci-dessus pour lire:

RewriteRule ^loader\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule^loader.php [L] 
+0

'ErrorDocument 404' ne sera jamais appelé. – anubhava

+1

@ anubhava Le 'ErrorDocument 404' est seulement pour quand loader.php lui-même n'existe pas. Si des mesures sont prises pour éviter une boucle de réécriture, le document d'erreur personnalisé semble être traité correctement dans ce scénario. (Un genre de fichier '.htaccess 'à double usage semble-t-il - bien que ces directives soient sans doute supprimées si' loader.php' n'est pas présent, mais je suppose que cela évite d'avoir à éditer le fichier '.htaccess'?) – MrWhite