viết lại url tiền tố ở vị trí nginx


10

Tập tin cấu hình nginx của tôi như thế này:

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

Chúng ta cần cấu hình nginx để đáp ứng như sau:

1 、 Nếu url không có tiền tố "/api/mobile/index.php", và cổng của yêu cầu là 80, hãy chuyển hướng nó tới https 2 Nếu url tiền tố" /api/mobile/index.php",just hãy tiếp tục

Vì vậy, tôi thêm nội dung trong tập tin cấu hình:

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

        rewrite /* $server_name$reqeust_uri last;
    }

Bây giờ nội dung tập tin cấu hình là:

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

Hơn yêu cầu khớp với vị trí đầu tiên, sẽ không khớp với vị trí khác.

Điều đó có nghĩa là những yêu cầu này không thể đi qua php cgi.

Có ai biết làm thế nào để giải quyết vấn đề?

Câu trả lời:


4

Nginx chỉ phù hợp với một địa điểm. Di chuyển cấu hình đến vị trí đầu tiên quá.

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

Nhưng có một số yêu cầu trang html tĩnh được đề nghị chuyển hướng sang https. Điều đó thật xấu hổ
JordanLu

Typo có một giải pháp đơn giản để chuyển hướng http sang https như thế này://$server_name$request_uri;
Dlk

Bạn có thể cho tôi biết làm thế nào để viết nó không? @Dlk
JordanLu

btw, bạn có thể cải thiện điều này bằng cách sử dụng namedvị trí thay vì sao chép các thông số fastcgi.
tftd

0

Có các tùy chọn để sử dụng hai bối cảnh máy chủ riêng biệt, và không sử dụng nếu statement (tìm hiểu tại sao ở đây: https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/ ).

Cấu hình có thể là:

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;
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.