2013-09-23 16 views
7

Mam na przykład dwa pliki w moim katalogu głównym: one.php i two.php. Chciałbym dotrzeć do nich przez te adresy URL bez konieczności posiadania katalogów fizycznych en + de.Ustaw język za pomocą htaccess URLrewrite

  • mydomain.com/en/ jeden
  • mydomain.com/en/ dwa
  • mydomain.com/de/ jeden
  • mydomain.com/de/ dwa

Pierwszy katalog zostanie "zignorowany" i po prostu przekazać GET v z ustawieniem języka do pliku php, drugim katalogiem jest plik php bez rozszerzenia.

To właśnie używam w moim htaccess stracić rozszerzenie pliku dotąd:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php 

UPDATE/Rozwiązanie
Jest to całkiem przydatne: .htaccess rule for language detection
i to wydaje się dość dużo robić to, co chciałem:

RewriteRule ^(en|de|fr)/(.*)$ $2?lang=$1 [L,QSA] 
RewriteRule ^(.*)$ $1?lang=en [L,QSA] 

ONE MORE dodatkowe pytanie
Dla mydomain.com/en/ jeden/id45
Jeśli chcę przekazać id45 jako zmienna do one.php co linia w htaccess mam dodać?

+0

Twoje pytanie nie jest oczywista. Czy 'one.php i two.php' znajdują się w katalogu głównym lub w katalogu' en/',' de/'folders? – anubhava

+0

Pliki znajdują się w katalogu głównym ... Nie chcę mieć fizycznie folderów en + de Po prostu potrzebuję ich w adresie URL dla zmiennej językowej –

+0

@anubhava: Mam nadzieję, że to sprawi, że będzie bardziej zrozumiała. –

Odpowiedz

2

Można spróbować tej reguły:

DirectoryIndex index.php index.html 
DirectorySlash On 

Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on 
RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{DOCUMENT_ROOT}/$2.php -f 
RewriteRule ^(en|de|fr)/([^/]+)(?:/(.*)|)$ $2.php?lang=$1&var=$3 [L,QSA,NC] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.+?)/?$ $1.php [L] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([a-z]{2})/?$ index.php?lang=$1 [L,QSA,NC] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)/?$ $1?lang=en [L,QSA] 
+0

Dzięki, ale to powoduje "500 wewnętrzny błąd serwera" Może mój drugi kod jest nieprawidłowy! 'RewriteEngine on'
' RewriteCond% {REQUEST_FILENAME} -d'
'RewriteCond% {REQUEST_FILENAME} \ php -f. '
' RewriteRule^(. *) $ $ 1.php'
'RewriteRule^(en | de | fr)/([^ /] +)/(. *) $ 2.php? Lang = $ 1 & var = 3 USD [L, QSA, NC] '
' RewriteRule^(. *) $ 1? Lang = de [L, QSA] ' –

+0

Twój kod działa na mydomain.com/en/one/id45, ale dostanę 404 teraz dla mydomain.com/en/one choć plik one.php istnieje –

+0

Dzięki prawie doskonały: Tylko mydomain.com/en/, mydomain.com/fr/ itd. daje błąd 404 zamiast używania indeksu.php –

Powiązane problemy