önek URL'sini nginx konumunda yeniden yaz


10

Benim nginx yapılandırma dosyası şöyle:

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

Aşağıdakileri karşılamak için nginx'i yapılandırmamız gerekir:

Url Eğer 1, gelmez öneki vardır "/api/mobile/index.php",and isteğin noktası 80 olan url ise https 2 yönlendirerek vardır devam /api/mobile/index.php",just öneki"

Bu yüzden config dosyasına içerik ekliyorum:

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

        rewrite /* $server_name$reqeust_uri last;
    }

Şimdi yapılandırma dosyası içeriği:

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

İstek ilk konumla eşleştiğinde, diğer konumla eşleşmez.

Bu, bu isteğin php cgi'den geçemediği anlamına gelir.

Sorunun nasıl çözüleceğini bilen var mı?

Yanıtlar:


4

Nginx yalnızca bir konumla eşleşir. Yapılandırmayı ilk konuma da taşıyın.

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

Ancak, https'ye yönlendirilmek üzere yeniden adlandırılan bazı statik html sayfası isteği var. Bu utanç verici
JordanLu

://$server_name$request_uri;
Yazım hatası

Bana nasıl yazacağınızı söyleyebilir misiniz? @Dlk
JordanLu

btw, parametreleri namedçoğaltmak yerine konum kullanarak bunu geliştirebilirsiniz fastcgi.
tftd

0

İki ayrı sunucu bağlamı kullanma seçeneği vardır ve if deyimini kullanmamıştır (nedenini okuyun: https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/ ).

Yapılandırma şunlar olabilir:

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;
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.