Comment puis-je implémenter un RewriteCond / RewriteRule global dans Apache qui s'applique à tous les hôtes virtuels?

StackOverflow https://stackoverflow.com/questions/344588

  •  19-08-2019
  •  | 
  •  

Question

Le titre dit à peu près tout. :-) J'ai beaucoup d'hôtes virtuels et je veux placer un seul bloc de réécriture en haut du fichier httpd.conf qui réécrit les URL, quel que soit l'hôte virtuel vers lequel la demande peut être dirigée. Comment diable je fais ça?

J'ai trouvé ceci mais ma question est la même: comment puis-je le faire sans recourir aux fichiers .htaccess et effectuer une autre action pour chaque hôte virtuel?

OMGTIA!

Était-ce utile?

La solution

Spécifiez RewriteOptions InheritDown dans la portée parent (telle que httpd.conf) pour que vos règles soient appliquées dans les hôtes virtuels enfants sans les modifier.

Ceci ne fonctionnera que sur les hôtes virtuels pour lesquels la RewriteEngine directive est définie sur on:

  

Notez que les configurations de réécriture ne sont pas héritées par les hôtes virtuels. Cela signifie que vous devez avoir une directive RewriteEngine sur pour chaque hôte virtuel sur lequel vous souhaitez utiliser des règles de réécriture.

( source )

Apache le supporte depuis la version 2.4.8 (non disponible au moment de la question initiale).

À partir de la documentation pour RewriteOptions:

  

InheritDown

     

Si cette option est activée, toutes les configurations enfants hériteront de la configuration de la configuration actuelle. Cela revient à spécifier RewriteOptions Inherit dans toutes les configurations enfants. Voir l'option Hériter pour plus de détails sur la gestion des relations parent-enfant.   Disponible dans Apache HTTP Server 2.4.8 et versions ultérieures.

     

InheritDownBefore

     

Comme InheritDown ci-dessus, mais les règles de l'étendue actuelle sont appliquées avant les règles spécifiées dans l'étendue d'un enfant.   Disponible dans Apache HTTP Server 2.4.8 et versions ultérieures.

     

IgnoreInherit

     

Cette option force les configurations actuelle et enfant à ignorer toutes les règles héritées d'un parent spécifiant InheritDown ou InheritDownBefore.   Disponible dans Apache HTTP Server 2.4.8 et versions ultérieures.

     

( http://httpd.apache.org/docs/ current / mod / mod_rewrite.html # rewriteoptions )

Autres conseils

Par défaut, les paramètres de configuration mod_rewrite du contexte du serveur principal ne sont pas hérités par les hôtes virtuels. Pour que les paramètres du serveur principal s'appliquent aux hôtes virtuels, vous devez placer les directives suivantes dans chaque <VirtualHost> section:

RewriteEngine On
RewriteOptions Inherit 

cliquez sur http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html pour trouver plus d'informations

On dirait que la solution la plus simple possible consiste à ajouter

RewriteOptions inherit

à chaque directive VirtualHost. C'est au moins beaucoup plus simple que de jouer avec les fichiers .htaccess. Apache est assez clair sur le fait que

  

par défaut, les configurations de réécriture sont   pas hérité. Cela signifie que vous   besoin d'avoir un RewriteEngine sur   directive pour chaque hôte virtuel dans   que vous souhaitez utiliser.   ( http://httpd.apache.org/docs/1.3/mod/mod_rewrite. html )

et apparemment, le moyen de changer la valeur par défaut consiste à utiliser RewriteOptions dans l’enfant (vhost ou director). Vous devez donc faire quelque chose dans chaque enfant.

Je ne l'ai jamais testée, donc cela risque de ne pas fonctionner, mais j'essaierais d'ajouter une directive include dans tous les blocs d'hôtes virtuels dans un seul fichier. Vous devez modifier chaque bloc de configuration d'hôte virtuel une fois, mais vous devez ensuite disposer d'un emplacement central à partir duquel vous pouvez effectuer des modifications. YMMV.

Si vous essayez uniquement de réécrire quelque chose dans la partie domaine du nom, par exemple. pour corriger une faute d'orthographe courante, vous n'avez même pas besoin de l'option 'hériter'. J'ai configuré un hôte virtuel sans nom pour intercepter tous les noms d'hôte non valides et les respirer correctement avant de les rediriger.

Etant donné que cela utilise des redirections, l'hôte virtuel approprié sera trouvé après l'application des réécritures.

Options +Indexes +FollowSymLinks
RewriteEngine on
# If it begins with only domain.com, prepend www and send to www.domain.com
RewriteCond %{HTTP_HOST} ^domain [NC]
RewriteRule ^(.*) http://www.domain.com$1 [L,R=301]

# Correct misspelling in the domain name, applies to any VirtualHost in the domain
# Requires a subdomain, i.e. (serviceXXX.)domain.com, or the prepended www. from above
RewriteCond %{HTTP_HOST} ^([^.]+\.)dommmmmain\.com\.?(:[0-9]*)?$ [NC]
RewriteRule ^(.*) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+\.)?domain.com(.*) http://$1domain.com$2 [L,R=301]

# No-name virtual host to catch all invalid hostnames and mod_rewrite and redirect them
<VirtualHost *>
    RewriteEngine on
    RewriteOptions inherit
</VirtualHost>

J'ai toujours utilisé un & "catch-all &"; VHost pour les directives que je voulais à tous les niveaux, comme ......

Listen 80
NameVirtualHost *:80

<VirtualHost *:80>
ErrorLog "/var/log/apache2/error_log"
</VirtualHost>

<VirtualHost *:80>
ServerName alloftherestoftheVHosts.com
DocumentRoot "/ServiceData/.........
............ 

Et il a toujours semblé fonctionner ... les journaux d’erreur ont été combinés correctement, etc ...... mais il est possible que cela soit le résultat d’un événement précédent / conflictuel / similaire- directive d'esprit.

Note personnelle .. Celui qui a imaginé le schéma de configuration et la syntaxe d'Apache était un dingbat, ou un groupe de dingbats, qui passait trop de temps dans leur caverne ... Tout devrait être exorcisé et XMLisé, ou quelque chose! Bien qu'ils soient très différents les uns des autres ... le processus de configuration Hello-Kitty de Cherokee .. au NGinx config .... de manière très succincte ... sont tellement plus logiques ..

Vous pouvez utiliser InheritDownBefore pour éviter de devoir ajouter davantage de courrier indésirable à vos vhosts.

Exemple d'alias de letencrypt global:

# letsencrypt
<IfModule alias_module>
    Alias /.well-known/ /var/www/html/.well-known/
</IfModule>
<IfModule mod_rewrite.c>
    # prevent vhost rewrites from killing the alias
    RewriteEngine On
    RewriteOptions InheritDownBefore
    RewriteCond %{REQUEST_URI} ^/\.well\-known
    RewriteRule . - [L,PT]
</IfModule>

Vous pouvez ensuite le faire dans chacun de vos vhosts, sans autre directive:

<VirtualHost *:80>
    ....
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteRule ^/.*            /index.php [L,PT]
    </IfModule>
</VirtualHost>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top