réécrire l'url du préfixe à l'emplacement nginx

10

Mon fichier de configuration nginx comme ceci:

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

Nous devons configurer le nginx pour satisfaire les éléments suivants:

1 、 Si l'url n'a pas de préfixe "/api/mobile/index.php", et que le port de la demande est 80, redirigez-le vers https 2 、 Si l'url a le préfixe" /api/mobile/index.php",

J'ajoute donc du contenu dans le fichier de configuration:

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

        rewrite /* $server_name$reqeust_uri last;
    }

Maintenant, le contenu du fichier de configuration est:

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

Que la demande correspond au premier emplacement, ne correspondra pas à l'autre emplacement.

Cela signifie que ces requêtes n'ont pas pu passer par le php cgi.

Y a-t-il quelqu'un qui sait comment résoudre le problème?

JordanLu
la source

Réponses:

4

Nginx ne correspond qu'à un seul emplacement. Déplacez également la configuration vers le premier emplacement.

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
la source
Mais il existe des demandes de pages html statiques recommandées pour être redirigées vers https. C'est embarrassé
JordanLu
Typo, il existe une solution simple pour rediriger http vers https comme ceci://$server_name$request_uri;
Dlk
Pourriez-vous me dire comment l'écrire? @Dlk
JordanLu
btw, vous pouvez améliorer cela en utilisant l' namedemplacement au lieu de dupliquer les fastcgiparamètres.
tftd
0

Il y a la possibilité d'utiliser deux contextes de serveur séparés, et n'a pas utilisé l' instruction if (lisez pourquoi ici: https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/ ).

La configuration pourrait être:

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
la source