เขียนคำนำหน้า 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;
    }

ตอนนี้เนื้อหาไฟล์ config คือ:

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 ได้

มีใครบ้างที่รู้วิธีแก้ปัญหาหรือไม่

คำตอบ:


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

แต่มีคำขอหน้า HTML แบบคงที่ที่แนะนำให้เปลี่ยนเส้นทางไปยัง https นั่นอาย
JordanLu

Typo มีวิธีง่ายๆในการเปลี่ยนเส้นทาง http เป็น https เช่นนี้://$server_name$request_uri;
Dlk

คุณบอกฉันถึงวิธีการเขียนได้อย่างไร @Dlk
JordanLu

btw คุณสามารถปรับปรุงได้โดยใช้namedตำแหน่งแทนการทำซ้ำfastcgiพารามิเตอร์
tftd

0

มีตัวเลือกให้ใช้บริบทเซิร์ฟเวอร์ที่แยกกันสองตัวและไม่ได้ใช้ถ้ามีคำสั่ง (อ่านเหตุผลที่นี่: 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;
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.