nginx rewrite не работает, но не знаю, почему

Я должен здесь не хватает чего-то действительно глупого, но я этого не вижу. У меня следующий формат URL:

https://www.example.com/french/xx/cats_59_H_L.html

... и это правило:

rewrite ^/french/.*/cats_([0-9]+)_([A-Z])_([A-Z])\.html$ /cgi-bin/hotels/related_cats.cgi?ID=$1&start=$2&end=$3&type=chambres&t=french last;

Однако оно дает 404:

2017/08/30 12:52:59 [error] 8041#8041: *1147655 open() "/home/user/web/example.com/public_html/french/xx/cats_59_H_L.html" failed (2: No such file or directory), client: 81.174.134.133, server: example.com, request: "GET /french/xx/cats_59_H_L.html HTTP/2.0", host: "www.example.com"

ОБНОВЛЕНИЕ: Хорошо, хорошо Я нашел нарушающее правило, но пытаюсь решить, как его обойти.

location /french {
    include /home/fatpeter/conf/web/chambres.com.extra/other-cats-french.conf;
}

Моя основная конфигурация для домена:

server {
    listen      111.74.193.98:443 http2;
    listen      [::]:443 http2;
    server_name example.com www.example.com;
    root        /home/user/web/example.com/public_html;
    index       index.php index.html index.htm;
    access_log  /var/log/nginx/domains/example.com.log combined;
    access_log  /var/log/nginx/domains/example.com.bytes bytes;
    error_log   /var/log/nginx/domains/example.com.error.log error;

    ssl         on;
    ssl_certificate      /home/user/conf/web/ssl.example.com.pem;
    ssl_certificate_key  /home/user/conf/web/ssl.example.com.key;

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    if ($host = "example.com") {
        return 301 https://www.example.com$request_uri;
    }

    location / {

        include     /home/user/conf/web/nginx.example.com.rules.conf*;

        ssi on;

        location ~* ^.+\.(jpeg|jpg|png|gif|bmp|ico|svg|css|js)$ {
            expires     max;
        }

        location ~ \.cgi$ {
            gzip off;
            proxy_set_header X-Real-IP  $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header Host $host;
            proxy_pass http://127.0.0.1:8181;

        }

        location ~ [^/]\.php(/|$) {
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            if (!-f $document_root$fastcgi_script_name) {
                return  404;
            }

            fastcgi_pass    127.0.0.1:9002;
            fastcgi_index   index.php;
            include         /etc/nginx/fastcgi_params;
        }
    }

    error_page  403 /error/404.html;
    error_page  404 /error/404.html;
    error_page  500 502 503 504 /error/50x.html;

    location /error/ {
        alias   /home/user/web/example.com/document_errors/;
    }

    location ~* "/\.(htaccess|htpasswd)$" {
        deny    all;
        return  404;
    }

    location /vstats/ {
        alias   /home/user/web/example.com/stats/;
        include /home/user/web/example.com/stats/auth.conf*;
    }

    include     /etc/nginx/conf.d/phpmyadmin.inc*;
    include     /etc/nginx/conf.d/phppgadmin.inc*;
    include     /etc/nginx/conf.d/webmail.inc*;

    include     /home/user/conf/web/nginx.example.com.conf*;
}

Как видите, у нас есть вот это:

include     /home/user/conf/web/nginx.example.com.rules.conf*;

Этот файл содержит:

include     /home/user/conf/web/chambres.com.extra/301-redirects.conf;
include     /home/user/conf/web/chambres.com.extra/glinks-rules.conf;

... а затем внутри 301-redirects.conf у нас есть:

location /french/Gites {
    include /home/user/conf/web/chambres.com.extra/gites-cats-french.conf;
}
location /Gites {
    include /home/user/conf/web/chambres.com.extra/gites-cats-english.conf;
}

location /french/Chambres_D_Hotes {
    include /home/user/conf/web/chambres.com.extra/chambres-cats-french.conf;
}
location /Chambres_D_Hotes {
    include /home/user/conf/web/chambres.com.extra/chambres-cats-english.conf;
}

location /french {
    include /home/user/conf/web/chambres.com.extra/other-cats-french.conf;
}

Причина, по которой я сделал это таким образом, заключается в том, что у нас более 30 000 перезаписей для одного из верхнего уровня категории и 20, 000 правил в другом - поэтому я хотел разделить его, чтобы сэкономить на нагрузке.

Единственный способ, который я нашел вокруг этого, - это сделать:

location /french {
    rewrite ^/french/.*/cats_([0-9]+)_([A-Z])_([A-Z])\.html$ /cgi-bin/hotels/related_cats.cgi?ID=$1&start=$2&end=$3&type=chambres&t=french last;
    include /home/fatpeter/conf/web/chambres.com.extra/other-cats-french.conf;
}

Я думаю, это потому, что один блок останавливает другой. от бега, значит, они должны быть в одном блоке?

0
задан 30 August 2017 в 16:45
1 ответ

Скорее всего, nginx не видит перезапись. Регулярное выражение мне кажется правильным, поэтому я посмотрю, находится ли оно в правильном месте в вашей конфигурации nginx, и что ваш URI не используется другим местом или чем-то еще.

EDIT: Судя по вашему варианту использования нескольких включений для 301, я предлагаю переместить все это на карту . Это также может потенциально сделать это немного быстрее.

Например:

map $uri $is_rewrite {
    default     no_redirect;
    "~/regex" "/kitten";
    #...
};
server {
    #...
    if ($is_rewrite != no_redirect) {
        rewrite .? $is_redirect permanent;
    }
    #...
}

Самый простой способ - просто вставить его в файл, который вы включаете, из местоположения / french . Просто подумал, что упомяну карты, они могут облегчить вам жизнь :)

2
ответ дан 4 December 2019 в 13:30

Теги

Похожие вопросы