2010-10-31 6 views
0

J'ai des problèmes avec le mod_rewrite d'Apache. L'une des choses que j'essaye de faire est de cacher certains de mes détails d'implémentation, de sorte que, par exemple, l'utilisateur voit l'URL http://www.mysite.com/login mais Apache répond avec la page au http://www.mysite.com/doc_root/login.php à la place (de préférence sans montrer à l'utilisateur qu'il est un fichier PHP ou la structure du répertoire). Voici ce que j'ai dans mon fichier .htaccess:Apache mod_rewrite ne fait rien (?)

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^(www.)?mysite.com* 
RewriteRule ^/(\w+) /doc_root/$1.php [L] 

#Redirect http://www.mysite.com to the login page 
RewriteRule ^/?$ https://www.mysite.com/doc_root/login.php 

Mais quand je vais à http://www.mysite.com/login, je reçois une erreur 404, même si la page existe. Je n'ai clairement pas une bonne compréhension de la façon dont les conditions et les règles de mod_rewrite fonctionnent, alors quelqu'un peut-il me dire ce que je fais de mal? Merci.

+0

Je voudrais activer RewriteLog et définir RewriteLogLevel à une valeur élevée. –

+0

Vous devriez demander cela sur Serverfault.com – Bevor

+0

Impossible d'activer RewriteLog - le service d'hébergement ne le permet pas. Merci de m'avoir dirigé vers serverfault.com, je ne le savais pas avant. – jay

Répondre

0

Sortez doc_root de tout ce que vous avez. Cela vous donnera le résultat que vous demandez. Cependant je ne suis pas sûr si c'est désiré ou non. Comment allez-vous forcer quelqu'un à se connecter s'il tape manuellement http://www.mysite.com/index.php?

De même, si vous essayez de forcer tout le trafic vers SSL, il est préférable d'utiliser un second VirtualHost et Redirect au lieu de mod_rewrite. Ce sont toutes les questions sans doute mieux pour ServerFault

0
  • À moins que votre site a un tas de différents noms de domaine, et vous ne veulent mysite.com faire la ré-écriture, vous n'avez pas besoin RewriteCond. (Problème potentiel: Apache aime utiliser le nom de domaine sauf si vous définissez UseCanonicalName off Si le nom n'est pas ce qu'il attend, la réécriture ne se produira pas.)
  • Dans les modèles RewriteCond (et RewriteRule), . correspond à personnage. Ajoutez une barre oblique inverse avant eux. (Bogue mineur: il ne doit pas provoquer l'échec des réécritures, mais il doit également correspondre à des éléments tels que "mysite-com".)
  • mod_rewrite est en fait un filtre d'URL vers un nom de fichier. Bien qu'il soit souvent utilisé pour réécrire des URL vers d'autres URL, il peut parfois arriver que ce que vous réécrivez soit une URL et qu'il ne puisse pas le savoir. (Surtout si ce à quoi il est réécrit serait un alias, ou ne se traduirait pas directement par un vrai nom de fichier.) Si vous ajoutez un drapeau [PT] à votre règle, il considérera l'URL réécrite et la transmettra aux autres filtres (y compris ceux qui transforment les URL en noms de fichiers).
  • Avez-vous vraiment besoin de "/ doc_root"? La racine du document doit déjà être configurée dans Apache en utilisant la directive DocumentRoot, et ne devrait pas faire partie de l'URL, à moins que vous n'ayez plusieurs applications sur le même domaine (auquel cas c'est la racine de l'application; changement).

MISE À JOUR:

  • Une autre chose que je pensais juste sur: Réécrire les règles fonctionnent différemment dans les fichiers .htaccess. Apache aime enlever la barre oblique. Donc, vous voudrez probablement vous débarrasser de la première barre dans vos modèles, ou au moins le rendre facultatif (^/?login au lieu de ^/login).
  • ^/?(\w+) correspondra à /doc_root/login.php et provoquera une réécriture de /doc_root/doc_root.php. Vous devriez probablement avoir un $ à la fin de votre modèle.
+0

Je suis toujours confus, mais je pense que c'était utile.Je me suis débarrassé de la directive RewriteCond parce que (pour l'instant) je n'ai qu'un domaine avec lequel je travaille. En termes de mod_rewrite étant un filtre d'URL vers un nom de fichier: le fichier auquel je veux que le serveur réponde est "/home2/interag6/public_html/doc_root/login.php". Cela signifie-t-il que ma directive devrait indiquer "RewriteRule ^/login /home2/interag6/public_html/doc_root/login.php"? – jay

+0

Vous devriez être capable de le faire. Cependant, si vous le faites, vous pouvez utiliser '% {DOCUMENT_ROOT}/doc_root/login.php' à la place. Mais avant de faire trop avec cela, voir la mise à jour - je suis tellement habitué à avoir un accès complet à un serveur, je ne pensais pas aux particularités de .htaccess. – cHao