Schreiben Sie die Präfix-URL an der Nginx-Position neu

10

Meine Nginx-Konfigurationsdatei sieht folgendermaßen aus:

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

Wir müssen den Nginx konfigurieren, um Folgendes zu erfüllen:

1 、 Wenn die URL nicht das Präfix "/api/mobile/index.php"," hat und der Port der Anforderung 80 ist, leiten Sie sie an https 2 weiter. 、 Wenn die URL das Präfix "/api/mobile/index.php", hat, fahren Sie fort

Also füge ich Inhalt in die Konfigurationsdatei ein:

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

        rewrite /* $server_name$reqeust_uri last;
    }

Der Inhalt der Konfigurationsdatei lautet nun:

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

Wenn die Anforderung mit dem ersten Standort übereinstimmt, stimmt sie nicht mit dem anderen Standort überein.

Das bedeutet, dass diese Anfrage nicht durch das PHP-CGI gehen konnte.

Gibt es jemanden, der weiß, wie man das Problem löst?

JordanLu
quelle

Antworten:

4

Nginx entspricht nur einem Standort. Verschieben Sie die Konfiguration ebenfalls an den ersten Speicherort.

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
quelle
Es wird jedoch empfohlen, eine statische HTML-Seitenanforderung an https umzuleiten. Das ist peinlich
JordanLu
Tippfehler gibt es eine einfache Lösung, um http wie ://$server_name$request_uri;
folgt
Können Sie mir sagen, wie ich es schreiben soll? @Dlk
JordanLu
Übrigens können Sie dies verbessern, indem Sie namedlocation verwenden, anstatt die fastcgiParameter zu duplizieren .
19.
0

Es gibt die Option, zwei getrennte Serverkontexte zu verwenden und keine if- Anweisung zu verwenden (lesen Sie hier, warum: https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/ ).

Die Konfiguration könnte sein:

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
quelle