Score:1

เขียนใหม่และบังคับให้เปลี่ยนเส้นทางในการเขียน URL ต้นทางใหม่ใน nginx

ธง in

ฉันมีอินสแตนซ์นี้ที่การค้นหา html <form> บังคับให้ไปที่ /search/index.php?q=term และต้องการใช้อย่างเช่น /คำที่ต้องการค้นหา แทน.

นี่คือลักษณะของการกำหนดค่าในขณะนี้:

สถานที่ /ค้นหา/ {
    เขียนใหม่ ^/search/(.+) /search/index.php?q=$1;
}

การเข้าถึงตำแหน่งนี้โดยตรงใช้งานได้ แต่ในขณะที่กรอกแบบฟอร์มและค้นหาจะใช้ "ต้นทาง" แทนการเขียนใหม่

ฉันลองใช้การเปลี่ยนเส้นทาง "ย้อนกลับ" แต่นั่นทำให้บริการ nginx ขัดข้อง:

สถานที่ /ค้นหา/ {
    เขียนใหม่ ^/search/(.+) /search/index.php?q=$1;
    เปลี่ยนเส้นทาง ^/search/index.php?q=(.+) /search/$1;
}

ฉันยังพยายามเขียนใหม่ด้วย ถาวร ธงซึ่งไม่ได้ทำอะไรเลย

สถานที่ /ค้นหา/ {
    เขียนใหม่ ^/search/(.+) /search/index.php?q=$1;
    เขียนใหม่ ^/search/index.php?q=(.+) /search/$1 ถาวร;
}

ฉันรู้ว่ามันเป็นไปได้ที่จะบรรลุสิ่งเดียวกันใน PHP ด้วยสิ่งนี้:

// บนสุดของ /search/index.php
ถ้า (str_starts_with($_SERVER['REQUEST_URI'], '/search/index.php')){
    $โปรโตคอล = ($_SERVER['HTTP_X_FORWARDED_PROTO'] == "https") ? "https" : "http";
    $เซิร์ฟเวอร์ = $_SERVER['HTTP_HOST'];
    $แบบสอบถาม = อาร์เรย์ ();
    parse_str($_SERVER['QUERY_STRING'], $แบบสอบถาม);
    $search = $queries['q'] ?? "";
    ส่วนหัว ("ตำแหน่ง: $โปรโตคอล://$เซิร์ฟเวอร์/ค้นหา/$ค้นหา");
}

แต่คิดว่ามันจะดีกว่าถ้า nginx สามารถจัดการสิ่งนี้ได้ (ถ้าเป็นไปได้เลย)

ไม่มีใครรู้วิธีเขียนใหม่และเปลี่ยนเส้นทางการเข้าถึงจากต้นทาง ?

Richard Smith avatar
jp flag
ไม่ทราบว่าคำสั่ง `redirect` คืออะไร แต่คุณสามารถแสดงรายการบันทึกการเข้าถึงสำหรับคำขอที่ล้มเหลวได้หรือไม่
Typewar avatar
in flag
@RichardSmith โอเค ฉันเข้าใจ ฉันเริ่มผิดแล้วได้จากที่นี่ https://ubiq.co/tech-blog/rewrite-vs-redirect-nginx/ บันทึกของ Nginx systemd บอกว่าเป็นคำสั่งที่ไม่รู้จัก
Richard Smith avatar
jp flag
คุณหมายถึงอะไรโดย "กำเนิด"? คุณกำลังบอกว่าแบบฟอร์มส่งคำขอไปที่ `/search/index.php?...` และคุณต้องการเปลี่ยนแถบที่อยู่ของเบราว์เซอร์เป็น `/search/...` หรือไม่
Typewar avatar
in flag
ใช่ หรือเจาะจงกว่านั้น: `/search/index.php?q=[term]` และเปลี่ยนเส้นทางไปที่ `/search/[term]`
Score:1
ธง jp

การกำหนดค่าที่มีอยู่มีลักษณะดังนี้:

สถานที่ /ค้นหา/ {
    เขียนใหม่ ^/search/(.+) /search/index.php?q=$1;
}
ตำแหน่ง ~ \.php$ {
    ...
}

URI /search/index.php ใช้ภายในจึงพยายามใช้ เขียนใหม่ ^/search/index.php?q=(.+) /search/$1 ถาวร; จะสร้างลูปเปลี่ยนเส้นทาง

เพื่อระบุ URI เป็น an คำขอภายนอกคุณต้องดูที่ $request_uri ตัวแปร. และคุณจะต้องใช้ น่าอับอาย ถ้า คำแถลง. ตัวอย่างเช่น:

ถ้า ($request_uri ~ ^/search/index\.php\?q=(.+)) {
    ส่งคืน 301 /search/$1;
}
สถานที่ /ค้นหา/ {
    เขียนใหม่ ^/search/(.+) /search/index.php?q=$1;
}
ตำแหน่ง ~ \.php$ {
    ...
}
Typewar avatar
in flag
ตกลงฉันเข้าใจ ฉันพยายามใส่คำสั่ง if ภายในขอบเขตของ `/search/` แต่ไม่ได้ผล นอกขอบเขตทำงานได้ ขอบคุณมาก!
Richard Smith avatar
jp flag
แท้จริงแล้ว URI `/search/index.php` ถูกจัดการโดยบล็อก `location ~ \.php$` เนื่องจากมันลงท้ายด้วย `.php`
Typewar avatar
in flag
อ่า! มีเหตุผลขอบคุณสำหรับการชี้แจง
us flag
เราสามารถใช้ `if ($arg_q ~ (.+))` เป็นเงื่อนไข `if` โดยจะจับคู่เฉพาะเมื่ออาร์กิวเมนต์คิวรี `q` ไม่ว่างเปล่า ไม่จำเป็นต้องใช้ `$request_uri`

โพสต์คำตอบ

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