Comment puis-je résoudre le problème pour lequel mes règles de réécriture ne sont pas appliquées par Apache?

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

  •  03-07-2019
  •  | 
  •  

Question

J'ai une application Web tomcat 6 exécutée avec apache httpd comme interface frontale. J'utilise mod_proxy et mod_proxy_ajp pour transmettre les demandes à tomcat. Mon serveur est sous ubuntu. Maintenant, j'essaie d'utiliser mod_rewrite pour supprimer le principal www, de sorte que l'URL de mon site canonique soit http://domain.com plutôt que http://www.domain.com

J'ai lu un certain nombre de tutoriels sur l'utilisation de mod_rewrite, mais je ne parviens pas à faire de la réécriture. J'ai essayé de mettre la règle de réécriture dans un fichier .htaccess (après avoir modifié mon fichier / etc / apache / sites-available / default pour définir AllowOverride all). J'ai essayé de mettre la règle de réécriture dans apache2.conf, httpd.conf et rewrite.conf. J'ai essayé tout cela avec la journalisation de réécriture activée. Le fichier journal est créé, mais Apache ne lui a rien écrit. Je pensais que peut-être que mod_proxy empêchait l’utilisation des règles de réécriture, j’ai donc essayé de le désactiver également ... et je n’obtiens toujours aucune réécriture, et rien dans le journal.

À ce stade, je ne sais absolument pas quoi faire ensuite. Comment puis-je résoudre le problème de la raison pour laquelle Apache n’utilise pas mes règles de réécriture?

Pour référence, voici mes directives de réécriture:

<IfModule mod_rewrite.c>

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
    RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]
    RewriteLog "/var/log/apache2/rewrite.log"
    RewriteLogLevel 3

</IfModule>

Modifier : les réponses ci-dessous sont utiles dans mon cas particulier, mais ne sont probablement pas aussi utiles pour l'ensemble de la communauté que des réponses sur la façon dont vous résolvez les directives Apache en général. Par exemple, y a-t-il un moyen d'activer la journalisation au point de me dire quelles directives sont appliquées dans quel ordre à l'arrivée de la demande?

Modifier 2 : les choses vont bien maintenant. Mes hôtes virtuels n'étaient pas tout à fait configurés correctement et je n'avais pas non plus parfaitement le droit de réécrire regex. Voici les directives de réécriture finales que je me suis mis au travail:

<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
        RewriteRule ^(.*)$ http://domain.com$1 [L,R=301]
</IfModule>
Était-ce utile?

La solution

Tentative de réponse à votre question : pour déboguer une opération Apache, vous pouvez ajuster la LogLevel à un niveau inférieur (peut-être déboguer ). Mais même si vous mettez debug si vous désactivez le journal du module en question, vous n’en obtiendrez aucun message. Par exemple, le [RequestLogLevel] [2] par défaut est 0, par exemple, le module n’écrit aucun message. Je vois que vous l'avez réglé à 3 mais comme RoBorg a déclaré le changer en 9 qui est peut-être trop faible pour votre cas.

Essayez de résoudre votre problème : essayez de changer la façon dont vous réécrivez le nom d'hôte en utilisant la forme inversée - regardez si le nom d'hôte est ce que vous voulez et changez-le en nom d'hôte souhaité. . Comme indiqué dans le Guide de réécriture d'URL - Serveur HTTP Apache sur Apache Site:

  

Noms d'hôte canoniques

     

Description :       Le but de cette règle est de forcer l’utilisation d’un nom d’hôte particulier,   préférence à d'autres noms d'hôte qui   peut être utilisé pour atteindre le même site.   Par exemple, si vous souhaitez forcer le   utilisation de www.example.com au lieu de   example.com, vous pouvez utiliser une variante   de la recette suivante. Solution:

# To force the use of 
RewriteEngine On
RewriteCond %{HTTP_HOST}   !^www\.example\.com [NC]
RewriteCond %{HTTP_HOST}   !^$
RewriteRule ^/(.*)         http://www.example.com/$1 [L,R]

Dans leur exemple, ils passent de exemple.com à www.exemple.com mais vous avez eu l’idée. Adaptez-le simplement à votre cas.

Autres conseils

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
    RewriteRule ^(.*)$ "http\:\/\/domain\.com\/$1" [R=301,L]

</IfModule>

Vous avez eu le même problème avec mon serveur, mais cela a fonctionné

Essayez d’augmenter le niveau de journalisation jusqu’à 9 (maximum).
Assurez-vous qu'apache dispose des droits appropriés sur le fichier journal (même si, s'il l'a créé, il est probable qu'il puisse également l'écrire).
Essayez une autre règle de réécriture, sans condition, par exemple, RewriteRule. * Www.google.com [RL]

Dans quel contexte ces règles sont-elles placées? Vous pourriez les placer sous un autre hôte virtuel, par exemple. Essayez de les placer en dehors de tout conteneur si vous n'avez qu'un seul domaine à tester.

Dans tous les cas, il existe une alternative pour réaliser le "non-www", consiste à utiliser deux hôtes virtuels, un pour le www et un autre pour le "non-www". www on redirige vers l'autre:

<VirtualHost *:80>
    ServerName www.domain.com
    Redirect permanent / http://domain.com
</VirtualHost>


<VirtualHost *:80>
    ServerName domain.com
    #The rest of the configuration (proxying, etc.)
</VirtualHost>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top