przepisz adres URL prefiksu w lokalizacji nginx

10

Mój plik konfiguracyjny nginx wygląda następująco:

server {
    listen 80;
    listen 443 ssl;
    server_name XXX.com;

    error_log  /log/nginx/xxx.com_error.log;
    access_log /log/nginx/xxx.com_access.log main;

    root /data/www/;
    index index.php index.html index.htm;

    location ~ \.php$ {
        add_header X-Frame-Options SAMEORIGIN;

        fastcgi_pass   127.0.0.1:9000;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

Musimy skonfigurować nginx, aby spełnić następujące wymagania:

1 、 Jeśli adres URL nie ma prefiksu „/api/mobile/index.php" ,, a port żądania to 80, przekieruj go do https 2 、 Jeśli adres URL ma prefiks” /api/mobile/index.php"; wystarczy kontynuować

Dodaję więc zawartość do pliku konfiguracyjnego:

    location ~ ^(?!/api/mobile/index\.php).*$ {
        if ($server_port = "80") {
               return 301 https://$server_name$request_uri;
        }

        rewrite /* $server_name$reqeust_uri last;
    }

Teraz zawartość pliku konfiguracyjnego to:

server {
    listen 80;
    listen 443 ssl;
    server_name XXX.com;

    error_log  /log/nginx/xxx.com_error.log;
    access_log /log/nginx/xxx.com_access.log main;

    root /data/www/;
    index index.php index.html index.htm;

    location ~ ^(?!/api/mobile/index\.php).*$ {
        if ($server_port = "80") {
               return 301 https://$server_name$request_uri;
        }

        rewrite /* $server_name$reqeust_uri last;
    }

    location ~ \.php$ {
        add_header X-Frame-Options SAMEORIGIN;

        fastcgi_pass   127.0.0.1:9000;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

Niż żądanie pasuje do pierwszej lokalizacji, nie pasuje do drugiej lokalizacji.

Oznacza to, że te żądania nie mogły przejść przez php cgi.

Czy jest ktoś, kto wie, jak rozwiązać problem?

JordanLu
źródło

Odpowiedzi:

4

Nginx pasuje tylko do jednej lokalizacji. Przenieś config również do pierwszej lokalizacji.

location ~ ^(?!/api/mobile/index\.php).*$ {
    if ($server_port = "80") {
           return 301 https://$server_name$request_uri;
    }

    add_header X-Frame-Options SAMEORIGIN;

    fastcgi_pass   127.0.0.1:9000;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

location ~ \.php$ {
    add_header X-Frame-Options SAMEORIGIN;

    fastcgi_pass   127.0.0.1:9000;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}
Justinas
źródło
Ale istnieją pewne statyczne żądania strony HTML zalecane do przekierowania na https. To zawstydzone
JordanLu
W literówce istnieje proste rozwiązanie przekierowujące http na https w ten sposób://$server_name$request_uri;
Dlk
Czy możesz mi powiedzieć, jak to napisać? @Dlk
JordanLu
btw, możesz to poprawić, używając namedlokalizacji zamiast powielać parametry fastcgi.
tftd
0

Istnieje opcja użycia dwóch oddzielnych kontekstów serwera i nie użyto instrukcji if (czytaj tutaj: https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/ ).

Konfiguracja może być:

server {
    listen 80;
    server_name XXX.com;

    error_log  /log/nginx/xxx.com_error.log;
    access_log /log/nginx/xxx.com_access.log;

    root /data/www;
    index index.php index.html index.htm;

    location /api/mobile/index.php {
        rewrite ^(.*)$ https://$host$1 redirect;
    }

    location ~ \.php$ {
        add_header X-Frame-Options SAMEORIGIN;

        fastcgi_pass  127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include       fastcgi_param;
    }
}

server {
    listen 443 ssl http2;
    server_name XXX.com;

    error_log  /log/nginx/xxx.com_ssl_error.log;
    access_log /log/nginx/xxx.com_ssl_access.log;

    root /data/www;
    index index.php index.html index.htm;

    location ~ \.php$ {
        add_header X-Frame-Options SAMEORIGIN;

        fastcgi_pass  127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include       fastcgi_param;
    }
}
Ernani Azevedo
źródło