2017-05-03 1 views
1

Entwicklung einer mehrsprachigen Website. Die Sprache wird als Sitzungsvariable gespeichert und der Inhalt jeder Sprache wird auf dieselbe Seite geladen - effektiv verschiedene Übersetzungen des englischen Inhalts. Ich brauche jedoch unterschiedliche URLs für jede Sprache.htaccess rewrite Ordner von Dateianforderung entfernen

Die Sprache wird immer ein 2-Zeichen-Ordner am Anfang der URI sein, aber Englisch wird keinen Ordner haben. Zum Beispiel:

www.mydomain.com/product/detail [English] 
www.mydomain.com/fr/product/detail [French] 
www.mydomain.com/de/product/detail [German] 
www.mydomain.com/ja/product/detail [Japanese] 

Alle diese URLs würde die gleiche Datei holen:

www.mydomain.com/product-detail.php 

Hier meine aktuellen .htaccess Regeln sind:

# ==== REWRITE URLS ==== 
RewriteEngine On 

# Permanently redirect "foo.php" to "/foo"# 
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC] 
RewriteRule^/%1 [NE,L,R=301] 

# pass through root 
RewriteRule ^(index\.php|Sitemap\.xml)?$ - [L] 

# no more/so add extension 
RewriteCond $1 !/ 
RewriteCond $1 !\.php$ 
RewriteCond ${REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ /$1.php [L] 

RewriteCond %{REQUEST_URI} !\.php$ 
RewriteRule ^(_css|_includes|_assets|_scripts)($|/) - [L] #exclude these folders using the 'last: L' flag 
RewriteRule ^(.*)/(.*)$ /$1-$2 [L] 

# === end rewrite URLs === 

Also muss ich eine zusätzliche Rewrite-Regel, dass sagt 'Ignoriere den ersten Ordner, wenn es 2 Zeichen lang ist und stimmt mit FR | DE | JA' überein, aber funktioniert auch mit den bestehenden Regeln.

Jede Hilfe sehr als .htaccess geschätzt werden würde, ist nicht meine Stärke ...

Antwort

1

Ihre Regeln mit einer Überholung tun könnten, da sie ein wenig zweideutig, widersprüchlich und langatmige an Orten sind. Davon abgesehen, da es klar ist, sie arbeiten, unabhängig davon, dass [1], sieht die letzte Regel dies zu ändern, wie es tun soll, wie Sie fragen:

RewriteRule ^(?:(?:fr|de|ja)/)?(.*)/(.*)$ /$1-$2 [L] 

Es funktioniert nur mit Kleinsprachcodes, wie in Ihre Beispiele. Es kann geändert werden, um jeden Fall zu unterstützen, wenn Sie, wie in Ihrer Beschreibung, die Flaggen in eckigen Klammern am Ende zu [L,NC] ändern müssen.

1 - Die Implikation ist, dass später die Änderungen konnten nicht wie vorgesehen funktionieren, oder einige Dinge vielleicht nicht so

aktualisieren

auch mit URLs wie /product erwartet funktionieren zu umgehen, versuchen Sie, diese zu das Ende:

RewriteCond %{REQUEST_URI} !\.php$ 
RewriteRule ^(?:(?:fr|de|ja)/)(.*)$ /$1 [L] 

Update 2

So am Ende sollte es so aussehen:

RewriteCond %{REQUEST_URI} !\.php$ 
RewriteRule ^(_css|_includes|_assets|_scripts)($|/) - [L] #exclude these folders using the 'last: L' flag 
RewriteRule ^(?:(?:fr|de|ja)/)?(.*)/(.*)$ /$1-$2 [L] 

RewriteCond %{REQUEST_URI} !\.php$ 
RewriteRule ^(?:(?:fr|de|ja)/)(.*)$ /$1 [L] 

Update 3

Planänderung, sorry, aber klar, nur das wird nicht funktionieren. Versuchen Sie stattdessen, die zweite zum letzten Abschnitt ersetzt:

# no more/so add extension 
RewriteCond $1 !/ 
RewriteCond $1 !\.php$ 
RewriteCond ${REQUEST_FILENAME} !-f 
RewriteRule ^(?:(?:fr|de|ja)/)?(.*)$ /$1.php [L] 

Der letzte Abschnitt sollte zurück zu:

RewriteCond %{REQUEST_URI} !\.php$ 
RewriteRule ^(_css|_includes|_assets|_scripts)($|/) - [L] #exclude these folders using the 'last: L' flag 
RewriteRule ^(?:(?:fr|de|ja)/)?(.*)/(.*)$ /$1-$2 [L] 

Und nur zu wiederholen, ich mag das nicht, es ist nicht ein elegante Lösung, aber es sollte funktionieren und ist eine natürliche Weiterentwicklung dessen, wie es bereits eingerichtet ist. Wirklich alles muss neu geschrieben werden.

Hier ist das Ganze nur klar zu sein:

# ==== REWRITE URLS ==== 
RewriteEngine On 

# Permanently redirect "foo.php" to "/foo"# 
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC] 
RewriteRule^/%1 [NE,L,R=301] 

# pass through root 
RewriteRule ^(index\.php|Sitemap\.xml)?$ - [L] 

# no more/so add extension 
RewriteCond $1 !/ 
RewriteCond $1 !\.php$ 
RewriteCond ${REQUEST_FILENAME} !-f 
RewriteRule ^(?:(?:fr|de|ja)/)?(.*)$ /$1.php [L] 

RewriteCond %{REQUEST_URI} !\.php$ 
RewriteRule ^(_css|_includes|_assets|_scripts)($|/) - [L] #exclude these folders using the 'last: L' flag 
RewriteRule ^(?:(?:fr|de|ja)/)?(.*)/(.*)$ /$1-$2 [L] 

# === end rewrite URLs === 
+0

Danke, es für diese Art von URL funktioniert: 'mydomain.com/fr/Produkt/detail' aber es funktioniert nicht mit einem 404 auf so etwas wie: 'mydomain.com/fr/product' – Dodo

+0

Ich habe eine Regel hinzugefügt, die das funktionieren sollte. Gib mir Bescheid. – SuperDuperApps

+0

Danke aber kein Glück. Jetzt funktioniert es in umgekehrter Reihenfolge - OK für '/ product', aber 404 für'/product/detail'. An dieser Stelle sieht der letzte Regelsatz folgendermaßen aus: 'RewriteCond% {REQUEST_URI}! \. Php $ RewriteRule^(_css | _includes | _assets | _scripts) ($ | /) - [L] RewriteRule^(?: (?: fr | de | ja) /) (. *) $/$ 1 [L] ' – Dodo