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?

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

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;
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.