tulis ulang url awalan di lokasi nginx

10

File konfigurasi nginx saya seperti ini:

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;
    }
}

Kita perlu mengkonfigurasi nginx untuk memenuhi yang berikut:

1 、 Jika url tidak memiliki awalan "/api/mobile/index.php",000dan port permintaannya adalah 80, arahkan ulang ke https 2 、 Jika url memiliki awalan" /api/mobile/index.php",lanjutkan

Jadi saya menambahkan konten dalam file konfigurasi:

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

        rewrite /* $server_name$reqeust_uri last;
    }

Sekarang konten file config adalah:

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;
    }
}

Dari permintaan cocok dengan lokasi pertama, tidak akan cocok dengan lokasi lainnya.

Itu berarti permintaan ini tidak dapat melalui php cgi.

Apakah ada orang yang tahu bagaimana menyelesaikan masalah?

JordanLu
sumber

Jawaban:

4

Nginx hanya cocok dengan satu lokasi. Pindahkan config ke lokasi pertama juga.

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
sumber
Tetapi ada beberapa permintaan halaman html statis yang direkomendasikan untuk dialihkan ke https. Itu memalukan
JordanLu
Typo ada solusi sederhana untuk mengarahkan http ke https seperti ini://$server_name$request_uri;
Dlk
Bisakah Anda memberi tahu saya cara menulisnya? @ DL
JordanLu
btw, Anda dapat meningkatkan ini dengan menggunakan namedlokasi alih-alih menduplikasi fastcgiparams.
tftd
0

Ada opsi untuk menggunakan dua konteks server yang terpisah, dan tidak menggunakan pernyataan if (baca alasannya di sini: https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/ ).

Konfigurasi dapat berupa:

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
sumber