2016-09-30 1 views
1

Ich verschiebe eine Site von Apache zu nginx und bleibe mit der folgenden Konfiguration stecken.Konfigurieren Sie die Unterverzeichnisse für die nginx-Sprache

Ich habe Website http://example.com/, die die Hauptversion (Englisch) zeigt. Ich habe auch ein paar mehr Sprachen, die mit entsprechenden Unterverzeichnissen geöffnet werden können. http://example.com/dehttp://example.com/fr, http://example.com/es oder http://example.com/es/ (mit einem Schrägstrich).

Diese Unterverzeichnisse sind virtuell (nicht vorhanden), sollten aber dieselben Seiten aus dem Stammverzeichnis öffnen. Ein PHP-Skript behandelt die Sprachdarstellung.

Jetzt Englisch Website funktioniert gut, aber andere Sprachen funktionieren nicht. Ich kann öffnen http://example.com/es/ (nur mit einem abschließenden Zeichen) und es öffnet die Hauptseite, jedoch konnte nicht auf alle anderen Seiten zugegriffen werden (z. B. http://example.com/es/test.html, die eine SEO-Freund-URL ist). Ich habe bereits viele ähnliche Fragen und Antworten zu SO gelesen, aber keine davon sind hilfreich. Hier ist meine Konfiguration:

server { 
    .... 
    root /var/www; 
    index index.php index.html index.htm; 

    location/{ 
      rewrite ^/(de|fr|it|es)\/(.*)$ /$2; 
      try_files $uri $uri/ @fallback; 
    } 

    location @fallback { 
      rewrite ^(.*)$ /seo.php?$args last; 
    } 

    location ~* \.(jpeg|ico|jpg|gif|png|css|js|pdf|txt|tar|gz|wof|csv|zip|xml|yml) { 
      access_log off; 
      try_files $uri @static; 
      expires 14d; 
      add_header Access-Control-Allow-Origin *; 
      add_header Cache-Control public; 
      root /var/www; 
    } 

    location @static { 
      rewrite ^/(\w+)/(.*)$ /$2 break; 
      access_log off; 
      rewrite_log off; 
      expires 14d; 
      add_header Cache-Control public; 
      add_header Access-Control-Allow-Origin *; 
      root /var/www; 
    } 

    location /backend/ { 

      rewrite ^(.*)$ /backend/index.php last; 
    } 

    location ~ \.php$ { 
      try_files $uri =404; 
      fastcgi_split_path_info ^(.+\.php)(/.+)$; 
      fastcgi_pass unix:/var/run/php5-fpm.sock; 
      fastcgi_index index.php; 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      include fastcgi_params; 
    } 
} 

Es zuvor auf Apache arbeitete wie folgt:

RewriteRule ^(de|fr|it|es)\/(.*)$ $2 
RewriteCond %{REQUEST_URI} !^/(backend|template)/ 
RewriteCond %{REQUEST_FILENAME} !\.(gif|jpeg|png|js|css|swf|php|ico)$ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-l 
RewriteRule ^(.*)$ seo.php [L] 

Bitte beraten. Vielen Dank.

Antwort

1

Offensichtlich wandelt Apache /es in /es/ um, bevor das Umschreiben angewendet wird. nginx wird das nicht tun, wenn das Verzeichnis tatsächlich existiert.

Es kann jedoch leicht behoben werden, indem der reguläre Ausdruck optimiert und der abschließende Schrägstrich optional gemacht wird.

Versuchen Sie folgendes:

rewrite ^/(?:de|fr|it|es)(?:/(.*))?$ /$1; 

Das (:? ) Konstrukt ist eine Erfassungsgruppe.

EDIT:

Wenn Sie die Schrägstrich wollen „sichtbar“ hinzugefügt werden, dann werden Sie eine Umleitung benötigen. Zum Beispiel:

+0

Wenn ich jetzt versuche, example.com/de zu öffnen, öffnet es stattdessen eine englische Version und fügt keinen abschließenden Schrägstrich hinzu (was ich versuche zu erreichen). Und alle anderen URLs in den Unterverzeichnissen der Sprache funktionieren immer noch nicht. z.B. example.com/de/test.html (seo freundliche URL). – Ssey

+0

Ich habe die Umleitungsoption hinzugefügt, um den abschließenden Schrägstrich anzuhängen. Was ist der Fehler in Bezug auf dein zweites Problem und wird '/ seo.php' ausgeführt? –

+0

Vielen Dank für Ihre Hilfe. Das Verzeichnis funktioniert jetzt. URL-Re-Writing funktioniert auch. Das Problem schien das folgende zu sein: Wenn ich versuche, auf ein PHP-Skript zuzugreifen, das nicht neu geschrieben werden sollte, z. example.com/de/api.php es scheint, es Routen zu seo.php als auch und dann 404 Fehler angezeigt wird. Wenn ich versuche, auf example.com/api.php (ohne Sprachverzeichnis) zuzugreifen, funktioniert es. – Ssey

Verwandte Themen