Вопрос:

Установить пользовательскую страницу ошибки 404 в nginx в зависимости от локали через параметр url

nginx webserver nginx-location

1057 просмотра

1 ответ

500 Репутация автора

я использую последнюю стабильную версию Nginxна GNU/LinuxОС и имею следующий виртуальный хост, я пытаюсь, setup custom localized 404 error pages avoiding ifно я всегда оказываюсь в циклах перенаправления.

К настоящему времени , я буду только созерцая следующие локали es, enи caкоторые я получаю в качестве параметра URL, всегда рядом с доменом. Что- expected URLs areто вроде:

http://www.example.com/ca
http://www.example.com/ca/home
http://www.example.com/en
http://www.example.com/en/contact

Это мой серверный блок nginx:

server {
        listen          80;
        listen          [::]:80;
        server_name     example.com;
        root            /var/www/html/example_com;
        # By default, show Castilian index
        index           es/index.html;

        access_log      /var/log/nginx/example_com.access.log main;
        error_log       /var/log/nginx/example_com.error.log error;

        #Remove HTML Extension
        rewrite ^(/.*)\.html(\?.*)?$ $1$2 permanent;

        # Remove trailing slash
        rewrite ^/(.*)/$ /$1 permanent;

        # Make sure Nginx knows what files to look for, and for that we use the try_files directive.
        # Look for a file with the current $uri and an .html extension, and if no file exists, 
        # check for a directory with that name and serve the index. Otherwise, render a 404 error.
        try_files $uri/index.html $uri.html $uri/ $uri =404;

        location = /form/contact.php {
                deny all;
                return 404;
        }

        # Custom error pages
        set $error404 /en/404.html;

        location /ca {
            set $error404 /ca/404.html;
        }

        error_page 404 =404 $error404;


        location = /form/contact {
                try_files $uri.php =404;

                include /etc/nginx/fastcgi_params;
                fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
                send_timeout 1800;
                fastcgi_read_timeout 1800;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
        }

        location ~ /\.ht {
            deny  all;
        }

        location ~ /(config) {
                deny all;
                return 404;
        }
    }
Автор: user846226 Источник Размещён: 13.04.2017 08:46

Ответы (1)


2 плюса

24825 Репутация автора

Решение

Вы не можете использовать блоки местоположения, как это, вы сломаете все остальные блоки местоположения. Посмотрите, как nginxобрабатывает запрос для деталей.

Есть более простой способ. Используйте именованное местоположение для обработки ответа 404 и просто переписайте исходный URI на требуемую страницу ошибки.

Например:

error_page 404 @error404;

location @error404 {
    rewrite ^/(en|es|ca) /$1/404.html last;
    rewrite ^ /en/404.html last;
}

Смотрите этот документ для более.

Автор: Richard Smith Размещён: 13.04.2017 12:49
Вопросы из категории :
32x32