Dr_Elvis
@Dr_Elvis

Как сделать редирект в зависимости от языка браузера?

Переношу сайт с одного сервера на другой.
На старом сервере использовался Apache, на новом Nginx.
Ранее был такой .htaccess:
RewriteEngine on
 # редирект на русскоязычную версию сайта
 RewriteCond %{REQUEST_URI} ^/$ [NC]
 RewriteCond %{HTTP:Accept-Language} (ru|uk|be|kk|mo|ka|et|bg|az) [NC]
 RewriteRule .* http://ru.site.net/ [R=302,L]
 # редирект на англоязычную версию сайта для всех остальных языков
 RewriteCond %{REQUEST_URI} ^/$ [NC]
 RewriteRule .* http://en.site.net/ [R=302,L]

Сейчас необходимо настроить так же на Nginx, но новом сервере. Подскажите как это сделать, если у меня 2 папки, в которых в одной всё на русском языке, а в другой на английском. настроены 2 раздела server в nginx/conf.d/
server {
    listen 80;
    listen [::]:80;

    root /home/site/www/site.net;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name site.net www.site.net;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}
server {
    listen 80;
    listen [::]:80;

    root /home/site/www/ru.site.net;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name ru.site.net www.ru.site.net;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}
server {
    listen 80;
    listen [::]:80;

    root /home/site/www/en.site.net;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name en.site.net www.en.site.net;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}
  • Вопрос задан
  • 1358 просмотров
Решения вопроса 1
Dr_Elvis
@Dr_Elvis Автор вопроса
Сделал так:
map $http_accept_language $lang {
    default en;
    ~ru ru;
    ~uk ru;
    ~be ru;
    ~kk ru;
    ~mo ru;
    ~ka ru;
    ~et ru;
    ~bg ru;
    ~az ru;
}
...
server {
    listen 80;
    listen [::]:80;

    root /home/site/www/site.net;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name site.net www.site.net;

    location = / {
	if ($lang = 'ru') {
		rewrite (.*) http://ru.site.net;
		}
	rewrite (.*) http://en.site.net;
	}

	location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
stranger777
@stranger777
Программист
Приучайте себя правильно искать и читать доки. Есть у Nginx модуль Accept Language
Из доков:

Alternative

You can manage $language_suffix by this setting when you cannot add this module into your system.

# accept-language: en,en-US;q=0.8,ja;q=0.6
set $first_language $http_accept_language;
if ($http_accept_language ~* '^(.+?),') {
set $first_language $1;
}

set $language_suffix 'en';
if ($first_language ~* 'ja') {
set $language_suffix 'ja';
}

По-дефолту модуль не собирается.
https://www.nginx.com/resources/wiki/modules/accep...

Всего доброго!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
31 окт. 2020, в 10:46
6000 руб./за проект
31 окт. 2020, в 10:17
1500 руб./за проект
31 окт. 2020, в 10:17
500 руб./за проект