2011-09-19 11 views
1

Nous travaillons sur la suppression des fichiers d'index de répertoire de nos URL pour nettoyer les choses et donner plus de cohérence pour améliorer notre référencement.URL Canonical avec Nginx

Cependant, je ne suis pas au courant de la façon de prendre soin de cela dans Nginx.

J'ai trouvé ce qui suit pour Apache (nous sommes juste à la recherche de l'équivalent Nginx)

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]+/)*index\.php\ HTTP/ 
RewriteRule  ^(([^/]+/)*)index\.php$ http://www.%{HTTP_HOST}/ [R=301,NS,L] 

J'ai lu la documentation et essayé plusieurs options - le plus proche que je peux obtenir renverrait encore une erreur de boucle infinie.

Répondre

1

L'extrait que vous avez publié pour Apache utilise la variable globale immutable %{THE_REQUEST} pour déterminer l'URI d'origine demandé par le client. Toutefois, cette variable contient la requête entière, y compris la méthode HTTP, la version et la chaîne de requête. Par conséquent, l'analyse de cette variable est un peu brouillon, comme le montre l'exemple que vous avez posté. Toutefois, nginx a une variable dédiée qui contient l'URI de demande d'origine reçue du client: $request_uri. Cela vous permet d'effectuer les opérations suivantes:

## REDIRECT foo/index(.html) to foo/ 
if ($request_uri ~ ^(.*/)index(?:\.html)?$) { 
    return 301 $1; 
} 

Si vous souhaitez également supprimer le suffixe de fichier, par ex. .html, vous pouvez utiliser l'extrait suivant:

## REDIRECT foo/bar.html to foo/bar 
if ($request_uri ~ ^(.+)\.html$) { 
    return 301 $1; 
} 

Maintenant, pour nginx de pouvoir servir encore le fichier correct, on utilise la directive try_files, qui vérifie tous donné URIs en séquence jusqu'à ce qu'un matches:

## Rewrite internal requests for foo/bar to foo/bar.html 
try_files $uri $uri.html =404; 

Ainsi, une demande de /foo/bar serait traitée comme suit:

  1. retour $uri = /foo/bar, si ce fichier existe dans le document racine, sinon
  2. retour $uri.html = /foo/bar.html si elle existe, enfin
  3. question
  4. une erreur 404.
+0

réponse Grand. Bienvenue sur Stack Overflow! – GargantuChet