переписать префикс URL в nginx месте

10

Мой конфигурационный файл nginx выглядит так:

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

Нам нужно сконфигурировать nginx для удовлетворения следующего:

1 、 Если URL не имеет префикса "/api/mobile/index.php",, а порт запроса равен 80, перенаправьте его на https 2 、 Если URL имеет префикс" /api/mobile/index.php",просто продолжайте

Поэтому я добавляю контент в файл конфигурации:

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

        rewrite /* $server_name$reqeust_uri last;
    }

Теперь содержимое файла конфигурации:

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

Чем запрос совпадает с первым местоположением, не будет совпадать с другим местоположением.

Это означает, что этот запрос не может пройти через php cgi.

Есть кто-нибудь, кто знает, как решить проблему?

JordanLu
источник

Ответы:

4

Nginx соответствует только одному местоположению. Переместить конфигурацию в первое место тоже.

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
источник
Но есть некоторые статические html-запросы, которые необходимо перенаправить на https. Это смущает
JordanLu
Опечатка есть простое решение для перенаправления http на https, как это://$server_name$request_uri;
Dlk
Не могли бы вы сказать мне, как написать это? @Dlk
JordanLu
Кстати, вы можете улучшить это, используя namedместоположение вместо дублирования fastcgiпараметров.
tftd
0

Существует возможность использовать два отдельных серверных контекста и не использовать оператор if (см. Почему здесь: https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/ ).

Конфигурация может быть:

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;
    }
}
Эрнани Азеведо
источник