Apache / mod_rewrite ile Accept-Language dayalı yönlendirmek için nasıl

1 Cevap php

Dil için şu anda HTTP_ACCEPT_LANG sunucu değişkeni denetler bir index.php dosyasını içeren web kök klasör oluşturmak yönlendirir. örneğin url için www.example.com/press/

in /var/www/site/press/index.php,

<?php
  if ($_SERVER["HTTP_ACCEPT_LANGUAGE"] == "en")
    header("location: ../press_en.php");
  else 
    header("location: ../press_de.php");
?>

Site büyüdükçe, biz şimdi birçok tür klasör var. . Tek bir htaccess dosyasına yönlendirmeler taşıyarak bu temizlemeye çalışıyorum:

RewriteEngine on

# Set the base path here
RewriteBase /path/to/site/

# The 'Accept-Language' header starts with 'en'
RewriteCond %{HTTP:Accept-Language} (^en) [NC]

# EN redirects
RewriteRule press(/?)$   press_en.php [L,R]

# DE redirects (for all languages not EN)
RewriteRule press(/?)$   press_de.php [L,R]

Fikir php dosyası olarak aynı, ama çalışmıyor. Ben Firefox tercihlerinde tüm olası dil ayarları / emir denedim, ve başlıklar doğru kontrol, ama her zaman press_de.php dosyasını vermektedir var.

Ne ben yanlış yapıyorum, ya da daha iyi bir yolu var ki? (not including content negotiation / multiviews or anything that requires renaming files, this is not currently an option).

1 Cevap

I /en/… veya /de/… gibi URL yolunun başlangıcında dil göstergesi koymak istiyorsunuz. Sonra tercih edilen dili kontrol eder ve dil göstergesi prepending tarafından isteği yönlendirir tek bir komut dosyası kullanabilirsiniz:

// negotiate-language.php
$availableLanguages = array('en', 'de');
if (!preg_match('~^/[a-z]{2}/~', $_SERVER['REQUEST_URI'])) {
    $preferedLanguage = someFunctionToDeterminThePreferedLanguage();
    if (in_array($preferedLanguage, $availableLanguages)) {
        header('Location: http://example.com/'.$preferedLanguage.$_SERVER['REQUEST_URI']);
    } else {
        // language negotiation failed!
        header($_SERVER['SERVER_PROTOCOL'].' 300 Multiple Choices', true, 300);
        // send a document with a list of the available language representations of REQUEST_URI
    }
    exit;
}

Ve gelen kurallar:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)$ negotiate-language.php [L]
RewriteRule ^([a-z]{2})/([^/]+)$ $2_$1.php [L]

Eğer Accept-Language başlık alanı olarak uygun bir someFunctionToDeterminThePreferedLanguage işlevini gerektiğini unutmayın tek bir değer ancak nitelikli değerler bir liste değildir. Yani sadece tek bir değerden daha fazla olabilir ve ilk değer her zaman tercih edilen bir değer değil.