Score:1

เว็บไซต์ NginX ส่งคืนหน้าเริ่มต้นด้วย HTTP (HTTPS ทำงานได้อย่างถูกต้อง)

ธง br

นี้ มี ถึงจะซ้ำกันแต่ผมหามานานแล้วไม่เจออะไรเลย

เมื่อฉันพิมพ์ที่อยู่เว็บไซต์ของฉันโดยใช้ httpฉันได้รับ หน้าเริ่มต้นของ NginX (https ทำงานได้ดี):

http://svija.love

ไฟล์กำหนดค่า NginX ประกอบด้วย:

เซิร์ฟเวอร์ {
    ถ้า ($host = svija.love) {
        ส่งคืน 301 https://$host$request_uri;
    } # จัดการโดย Certbot

    server_name svija.love;
    ฟัง 80;
    กลับ 404; # จัดการโดย Certbot
}

นี้คือ เพิ่มโดยอัตโนมัติโดย Certbot.

ข้าพเจ้าย่อมคาดหมายว่า ถ้า ($host = svija.love) จะจับคำขอ http และเปลี่ยนเส้นทางไปยัง HTTPS

แต่มันไม่ทำงานอย่างนั้น

ไม่ใช่ผู้เชี่ยวชาญสำหรับฉันดูเหมือนว่าบิตที่สองเริ่มต้นด้วย server_name svija.loveขัดแย้งโดยตรงกับภาคแรก:

  • บล็อกแรกจะเปลี่ยนเส้นทางหากโฮสต์คือ svija.love
  • บล็อกที่สองส่งคืน 404 หากโฮสต์คือ svija.love

ชื่อเซิร์ฟเวอร์จริงที่กำหนดค่าคือ live.svija.loveถ้ามันสร้างความแตกต่าง

คำชี้แจงใด ๆ ที่จะได้รับการชื่นชมอย่างมาก

[อัปเดต] ฉันลบไฟล์กำหนดค่าเริ่มต้นของ NginX และตอนนี้ HTTP เปลี่ยนเส้นทางไปยัง HTTPS ตามที่คาดไว้

ถึงกระนั้น ถ้าใครสามารถอธิบายบล็อกการกำหนดค่าทั้งสองด้านบนได้ ฉันอยากจะเข้าใจสิ่งที่พวกเขากำลังทำอยู่ให้ดีขึ้น

[อัปเดต] นี่ไม่ใช่วิธีแก้ปัญหาที่ดี (ดูด้านล่าง)

[อัปเดต นี่คือการกำหนดค่าที่กำหนดโดย nginx -T:

# ไฟล์กำหนดค่า /etc/nginx/nginx.conf:
ผู้ใช้ www-data;
worker_processes อัตโนมัติ
pid /run/nginx.pid;
รวม /etc/nginx/modules-enabled/*.conf;

เหตุการณ์ {
    worker_connections 768;
    # multi_accept บน;
}

http {

    ##
    # การตั้งค่าพื้นฐาน
    ##

    ปิดการส่งไฟล์;
    tcp_nopush บน;
    tcp_nodelay บน;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # ปิด server_tokens;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect ปิด;

    รวม /etc/nginx/mime.types;
    แอปพลิเคชัน default_type/octet-stream;

    ##
    # การตั้งค่า SSL
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # วาง SSLv3 อ้างอิง: พุดเดิ้ล
    เปิด ssl_prefer_server_ciphers;

    ##
    # การตั้งค่าการบันทึก
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # การตั้งค่า Gzip
    ##

    เปิด gzip;

    # gzip_vary บน;
    # gzip_proxyed ใด ๆ ;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types ข้อความ/ข้อความล้วน/แอปพลิเคชัน css/แอปพลิเคชัน json/ข้อความจาวาสคริปต์/แอปพลิเคชัน xml/แอปพลิเคชัน xml/xml+rss ข้อความ/จาวาสคริปต์;

    ##
    # การกำหนดค่าโฮสต์เสมือน
    ##

    รวม /etc/nginx/conf.d/*.conf;
    รวม /etc/nginx/sites-enabled/*;
}

# ไฟล์กำหนดค่า /etc/nginx/modules-enabled/50-mod-http-image-filter.conf:
load_module โมดูล/ngx_http_image_filter_module.so;

# ไฟล์กำหนดค่า /etc/nginx/modules-enabled/50-mod-http-xslt-filter.conf:
load_module โมดูล/ngx_http_xslt_filter_module.so;

# ไฟล์กำหนดค่า /etc/nginx/modules-enabled/50-mod-mail.conf:
load_module โมดูล/ngx_mail_module.so;

# ไฟล์กำหนดค่า /etc/nginx/modules-enabled/50-mod-stream.conf:
load_module โมดูล/ngx_stream_module.so;

# ไฟล์กำหนดค่า /etc/nginx/mime.types:

เซิร์ฟเวอร์ {

    # ต้องตรงกับชื่อโดเมนหรือที่อยู่ IP
    # มิฉะนั้นหน้า Nginx เริ่มต้นจะปรากฏขึ้น
    server_name antretoise.svija.site;

    # ไดเร็กทอรีขององค์ประกอบคงที่ของไซต์
    ตำแหน่ง / คงที่ / {
        ราก /บ้าน/antretoise;
    }

    access_log /opt/logs/access.antretoise;
    error_log /opt/logs/error.antretoise ข้อผิดพลาด;

    # ส่งคำถามเพิ่มเติมทั้งหมดไปยังแอปพลิเคชันของเรา
    ที่ตั้ง / {

        # พารามิเตอร์จาก /etc/nginx/uwsgi_params
        รวม uwsgi_params;

        #ส่งการจราจรไปยังซ็อกเก็ต
        # ที่เซิร์ฟเวอร์ uWSGI ตั้งค่า
        # ซ็อกเก็ตต้องตรงกับใน:
        # /etc/uwsgi/sites/antretoise.ini
        uwsgi_pass ยูนิกซ์:/run/uwsgi/antretoise.sock;
    }

    ฟัง 443 ssl; # จัดการโดย Certbot
    ssl_certificate /etc/letsencrypt/live/antretoise.svija.site/fullchain.pem; # จัดการโดย Certbot
    ssl_certificate_key /etc/letsencrypt/live/antretoise.svija.site/privkey.pem; # จัดการโดย Certbot
    รวม /etc/letsencrypt/options-ssl-nginx.conf; # จัดการโดย Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # จัดการโดย Certbot

}


เซิร์ฟเวอร์ {
    ถ้า ($host = antretoise.svija.site) {
        ส่งคืน 301 https://$host$request_uri;
    } # จัดการโดย Certbot


    ฟัง 80;
    server_name antretoise.svija.site;
    กลับ 404; # จัดการโดย Certbot


}
# ไฟล์กำหนดค่า /etc/nginx/uwsgi_params:

uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;

uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME โครงการ $;
uwsgi_param HTTPS $https if_not_empty;

uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;

ssl_session_cache แชร์:le_nginx_SSL:10m;
ssl_session_timeout 1440m;
ปิด ssl_session_tickets;

ssl_protocols TLSv1.2 TLSv1.3;
ปิด ssl_prefer_server_ciphers;

ssl_ciphers "EC-AES128-SHA";

#ââââââââââââââââ ว ค่าเริ่มต้น

เซิร์ฟเวอร์ {
    ฟัง 80 default_server;
    ฟัง [::]:80 default_server;

    รูท /var/www/html;

    # เพิ่ม index.php ในรายการหากคุณใช้ PHP
    ดัชนี index.html index.htm index.nginx-debian.html;

    ชื่อเซิร์ฟเวอร์ _;

    ที่ตั้ง / {
        # ความพยายามครั้งแรกในการให้บริการคำขอเป็นไฟล์ จากนั้น
        # เป็นไดเร็กทอรี จากนั้นถอยกลับไปแสดง 404
        try_files $uri $uri/ =404;
    }

}

#ââââââââââââââââ ââââââââââââââââ âââââââ svija.ความรัก

เซิร์ฟเวอร์ {

    server_name svija.love;

    # ไดเร็กทอรีขององค์ประกอบคงที่ของไซต์
    ตำแหน่ง / คงที่ / {
        ราก /home/svijalove;
    }

    access_log /opt/logs/access.svijalove;
    error_log /opt/logs/error.svijalove ข้อผิดพลาด;

    # ส่งคำถามเพิ่มเติมทั้งหมดไปยังแอปพลิเคชันของเรา
    ที่ตั้ง / {

        # พารามิเตอร์จาก /etc/nginx/uwsgi_params
        รวม uwsgi_params;

        #ส่งการจราจรไปยังซ็อกเก็ต
        # ที่เซิร์ฟเวอร์ uWSGI ตั้งค่า
        # ซ็อกเก็ตต้องตรงกับใน:
        # /etc/uwsgi/sites/svijalove.ini
        uwsgi_pass ยูนิกซ์:/run/uwsgi/svijalove.sock;
    }

    ฟัง 443 ssl; # จัดการโดย Certbot
    ssl_certificate /etc/letsencrypt/live/svija.love/fullchain.pem; # จัดการโดย Certbot
    ssl_certificate_key /etc/letsencrypt/live/svija.love/privkey.pem; # จัดการโดย Certbot
    รวม /etc/letsencrypt/options-ssl-nginx.conf; # จัดการโดย Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # จัดการโดย Certbot
}

เซิร์ฟเวอร์ {
    ถ้า ($host = svija.love) {
        ส่งคืน 301 https://$host$request_uri;
    } # จัดการโดย Certbot

    server_name svija.love;
    ฟัง 80;
    กลับ 404; # จัดการโดย Certbot
}

# 6 ไซต์อื่น ๆ ในตอนท้าย กำหนดค่าในลักษณะเดียวกันทั้งหมด
#ยกเว้นว่าในสองบรรทัดสุดท้าย
# ฟัง 80; บางครั้งมีการระบุไว้ก่อนส่งคืน 404;
in flag
FYI: เมื่อฉันค้นหา `http://svija.love` ฉันได้รับการเปลี่ยนเส้นทางไปที่ `https://svija.love/` ซึ่งให้ผลลัพธ์เป็น 500 หลังจากนั้น wget ลองคำขอที่สองอีกครั้งและได้รับ 200 ฉันไม่ รับ 404 สำหรับ 500 คุณต้องตรวจสอบบันทึกเซิร์ฟเวอร์ของคุณ
br flag
คุณทำแบบสอบถามได้อย่างไร? ฉันตระหนักดีว่าฉันระบุปัญหาผิด - ไม่ใช่ 404 ที่ฉันได้รับ (ในเบราว์เซอร์ของฉัน) แต่เป็นหน้าเริ่มต้นของ NginX (ฉันได้แก้ไขคำถามแล้ว) ฉันไม่เห็นข้อผิดพลาด 500 แต่ฉันจะตรวจสอบบันทึก
in flag
เพียงแค่ `wget -S http://svija.love` ง่ายๆ
br flag
ฉันลบการกำหนดค่าเริ่มต้นของ NginX และตอนนี้เปลี่ยนเส้นทางอย่างถูกต้อง ฉันคาดว่าเป็นเพราะกำลังตีความการกำหนดค่าเริ่มต้นก่อนที่จะมาถึงการกำหนดค่า svija.love
us flag
โปรดเพิ่มการกำหนดค่า nginx แบบเต็มที่กำหนดโดยคำสั่ง `nginx -T`
us flag
สิ่งเดียวที่ฉันคาดเดาคือบล็อก `if` ก่อน `server_name` รบกวน nginx โดยปกติแล้วฉันจะเริ่มบล็อก `เซิร์ฟเวอร์` ด้วย `listen`, `server_name` ที่ด้านบนเพื่อให้อ่านง่าย จากนั้นคำสั่งอื่นๆ
us flag
อีกทางเลือกหนึ่งสำหรับการดีบักนี้คือเปิดใช้งานบันทึกดีบัก nginx โดยใช้ `error_log /opt/logs/error.antretoise debug;` อาจจำเป็นต้องเริ่ม nginx ด้วยคำสั่งอื่น ทั้งนี้ขึ้นอยู่กับการกระจาย ด้วยบันทึกการดีบัก เราสามารถดูว่า nginx จัดการกับคำขอภายในได้อย่างไร
br flag
ฉันใช้เวลาสองสามชั่วโมงในการดูบันทึก และลองแก้ไขไฟล์ปรับแต่งต่างๆ แต่ก็ไม่สำเร็จ ในที่สุดก็เริ่มทำงานกับการกำหนดค่าดั้งเดิม (ดูคำตอบที่ฉันโพสต์) â อาจมีปัญหาการแคช DNS บางประเภท ขอขอบคุณสำหรับคำแนะนำของคุณ พวกเขาทำให้ฉันมีความกล้าที่จะลองต่อไปและมีความคิดสำหรับสิ่งที่ควรลอง
Score:2
ธง us

หากไม่มีโฮสต์เสมือนที่ตรงกันสำหรับ เจ้าภาพ ส่วนหัวในคำขอ จากนั้น nginx จะให้บริการเนื้อหาโฮสต์เสมือนเริ่มต้น

ในกรณีของคุณ โฮสต์เสมือนของคุณตรงกับ เจ้าภาพ สนามด้วย svija.ความรัก. อย่างไรก็ตาม ดูเหมือนว่าคุณกำลังทดสอบด้วย live.svija.love.

เนื่องจาก nginx ไม่พบโฮสต์เสมือนที่ตรงกัน จึงใช้ค่าเริ่มต้น

หลังจากที่คุณลบการกำหนดค่าโฮสต์เสมือนเริ่มต้นแล้ว nginx จะใช้โฮสต์เสมือนของคุณเป็นโฮสต์เสมือนเริ่มต้น นั่นไม่ใช่วิธีปฏิบัติที่ดี ทุกคนสามารถตั้งค่าระเบียน DNS สำหรับโดเมนที่ชี้ไปที่เว็บไซต์ของคุณ ผลลัพธ์ที่ได้ก็จะเป็นเช่นนั้น http://example.com จะแสดงเนื้อหาของ http://live.svija.love.

ซึ่งอาจส่งผลให้ Google ลงโทษสำหรับเนื้อหาที่ซ้ำกัน

เพื่อป้องกันสิ่งนี้ คุณควรกู้คืนโฮสต์เสมือนเริ่มต้น และปรับการกำหนดค่าปัจจุบันของคุณให้ถูกต้อง ชื่อเซิร์ฟเวอร์.

br flag
ฉันไม่ได้ทดสอบกับ live.svija.love â นั่นคือชื่อของเซิร์ฟเวอร์ (/etc/hosts) แต่ฉันไม่เคยพยายามไปที่เซิร์ฟเวอร์ตามที่อยู่นั้น ฉันจะคืนการตั้งค่าเริ่มต้นตามที่คุณแนะนำ และดูว่าฉันจะทำให้มันทำงานตามคำตอบของคุณได้หรือไม่
br flag
ตอนนี้เมื่อฉันไปที่ svija.love ฉันได้รับหน้าเริ่มต้นของ NginX อีกครั้ง สิ่งที่ฉันไม่เข้าใจคือทำไม svija.love ไม่ตรงกับ "if ($host = svija.love) {" ในการกำหนดค่า
br flag
ฉันเพิ่มการกำหนดค่า nginx แบบเต็มให้กับคำถาม
Score:0
ธง br

ฉันได้แก้ปัญหาโดยไม่เข้าใจจริงๆ

มีเจ็ดเว็บไซต์บนเซิร์ฟเวอร์ของฉัน และหกเว็บไซต์ทำงานได้อย่างถูกต้อง (http เปลี่ยนเส้นทางไปที่ https ตามที่คาดไว้)

ไซต์ทั้งเจ็ดมีบล็อกที่ส่วนท้ายของไฟล์กำหนดค่า NginX ที่มีลักษณะดังนี้:

เซิร์ฟเวอร์ {

# เปลี่ยนเส้นทางการรับส่งข้อมูลจาก http ไปยัง https สำหรับแต่ละโดเมนที่เกี่ยวข้อง

    ถ้า ($host = svija.love) {
        ส่งคืน 301 https://$host$request_uri;
    } # จัดการโดย Certbot

# รับรองว่าคำขอที่ตรวจจับได้จะไม่ถูกเปลี่ยนเส้นทางโดยไม่ตั้งใจ

    ฟัง 80;
    server_name svija.love;
    กลับ 404; # จัดการโดย Certbot
}

โฮสต์เซิร์ฟเวอร์ที่แท้จริงคือ live.svija.loveแต่เว็บไซต์ที่มีปัญหานั้นเป็นเพียง svija.ความรัก (ไม่มีเว็บไซต์ที่กำหนดค่าสำหรับ live.svija.love)

เห็นได้ชัดว่าปัญหาเกิดจากบรรทัดต่อไปนี้ไม่ได้รับการประเมินอย่างถูกต้อง:

ถ้า ($host = svija.love) {

ตามหลักแล้ว ไม่มีการกำหนดค่า IPv6 สำหรับเซิร์ฟเวอร์ (live.svija.love) และมีการกำหนดค่า IPv6 สำหรับเว็บไซต์ (svija.love) ซึ่งไม่ควรมีอยู่จริง

ฉันเพิ่มบันทึก IPv6 สำหรับเซิร์ฟเวอร์ และลบสำหรับเว็บไซต์
สิ่งนี้ไม่ส่งผลกระทบต่อปัญหา

แล้วฉันก็คิดว่าบางที $โฮสต์ ตัวแปรถูกตั้งค่าเป็น live.svija.love (ใครจะไปรู้ว่าทำไม) ก็เลยลองทดสอบเปลี่ยนดู

ถ้า ($host = svija.love) {

ถึง

ถ้า ($host = live.svija.love) {

ตามที่คาดไว้ หน้าเริ่มต้นของ NginX ถูกแทนที่ด้วยข้อผิดพลาด 404 (ดูบล็อกการกำหนดค่าด้านบน)

ดังนั้นฉันใส่กลับ

ถ้า ($host = live.svija.love) {

และตอนนี้ทุกอย่างทำงานได้อย่างถูกต้อง คำขอ HTTP ไปยัง svija.love ถูกเปลี่ยนเส้นทางไปที่ https://svija.love และปัญหาของฉันก็ได้รับการแก้ไข

ฉันคิดว่ามีกลไกการแคช DNS บางอย่างใน NginX ที่ล้มเหลว อาจเป็นเพราะฉันเปลี่ยนชื่อเซิร์ฟเวอร์เมื่อถึงจุดหนึ่งในอดีต

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา