2009-06-14 6 views
0

J'utilise le code suivant dans mon .htaccess:Pourquoi cette règle de réécriture ne fonctionne-t-elle pas?

Options +FollowSymlinks 
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteCond %{REQUEST_URI} !/$ 
RewriteRule (.*) $1\.php [L] 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)/$ /$1 [R=301,L] 

# Special rewrite rules 
# ideas/<id> 
RewriteRule ^ideas/([0-9]+)$ idea\?id=$1 
# users/<name> 
RewriteRule ^users/(.+)$ users\?name=$1 

Les idées/règle fonctionne bien, comme je m'y attendais pas, mais les utilisateurs/règle ne semble pas. Il me donne une erreur HTTP 500 et le journal Apache indique qu'il a dépassé la quantité de réoriente disponible:

[Dim 14 juin 2009 10:58:39] [error] [client 127.0.0.1] demande a dépassé la limite de 10 redirections internes en raison d'une erreur de configuration probable. Utilisez 'LimitInternalRecursion' pour augmenter la limite si nécessaire. Utilisez 'LogLevel debug' pour obtenir un backtrace, referer. http://localhost/users

L'URL que je teste sur est/utilisateurs/ross, qui devrait fonctionner correctement./ideas/1 fonctionne vraiment bien.

Répondre

1

Essayez dans cet ordre:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)/$ /$1 [R=301,L] 

RewriteRule ^ideas/([0-9]+)$ idea?id=$1 
RewriteRule ^users/(.+)$ users?name=$1 

RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule (.*) $1.php [L] 
+0

Cela provoque les idées/ pages pour arrêter de travailler avec la même erreur. – Ross

+0

Et que dit le journal du serveur à ce propos? Une erreur 500 peut signifier n'importe quoi. – Gumbo

+0

Mise à jour de la question. – Ross

1

Ce qui pourrait vous aider à déboguer la situation est de rendre les réécritures à distance (par exemple faire les envoyer redirections HTTP). De cette façon, vous verrez comment les demandes sont réécrites ce qui devrait vous aider à attraper le problème.

1

Ai-je raison de supposer que vous avez un fichier users.php et idea.php? Ensuite, vous pouvez rediriger vers ce fichier directement, sans avoir besoin d'un autre cycle de réécriture. Donc, pour ces deux règles:

RewriteRule ^ideas/([0-9]+)$ idea.php?id=$1 
RewriteRule ^users/(.+)$ users.php?name=$1 

(aussi: pas besoin d'échapper à la marque question le résultat)

Par ailleurs: Pourquoi est pluriel users.php alors que idea.php n'est pas? Comment gérez-vous/ideas/abc et ainsi de suite?

+0

Le pluriel était une erreur, j'ai corrigé cela depuis. Changer les redirections pour pointer vers les fichiers fonctionne cependant directement (bien que je serais intéressé de découvrir pourquoi il n'obéit pas aux règles précédentes). – Ross

+0

Il n'y a pas de sous-dossier "users" ou "ideas" sur votre système de fichiers qui aurait pu faire la différence entre les deux résultats? Je pense que les premières règles étaient juste incomplètes (et votre propre réponse aussi, à mon avis) ... Lorsque vous spécifiez le script, vous pouvez même ajouter [L] pour indiquer que vous avez terminé. – Arjan

0

Ajout d'un/avant que les fichiers fixes ceci:

RewriteRule ^ideas/([0-9]+)$ ideas?id=$1 
RewriteRule ^users/(.+)$ users?name=$1 

à:

RewriteRule ^ideas/([0-9]+)$ /ideas?id=$1 
RewriteRule ^users/(.+)$ /users?name=$1 
+0

Vous n'utilisez pas de chemin dans l'URL, comme example.org/folder/users/abc, n'est-ce pas? Et pourquoi ne pas réécrire le script dont vous avez besoin plutôt que de demander à Apache de savoir quoi faire avec/users? Name = $ 1? – Arjan

Questions connexes