Score:0

เปลี่ยนเส้นทาง Nginx ตามสตริงข้อความค้นหา

ธง in

ฉันกำลังย้ายลิงก์เว็บไซต์เก่าไปยังเว็บไซต์ใหม่ โดยจะใช้โดเมนเดิม

นี่คือลิงค์เก่าบางส่วน

ลิงค์เก่า ลิงค์ใหม่
http://example.com/?p=contact /ติดต่อ
http://example.com/?p=static&id=career /อาชีพ
http://example.com/?p=static&id=about /เกี่ยวกับ
http://example.com/?p=catalog&action=images&cat_id=1 /หมวดสินค้า/หมวดทาก-1
http://example.com/?p=catalog&action=images&cat_id=2 /หมวดสินค้า/หมวดทาก-2
http://example.com/?p=catalog&action=viewimages&pid=1&cat_id=1 /ผลิตภัณฑ์/ผลิตภัณฑ์ทาก-1
http://example.com/?p=catalog&action=viewimages&pid=2&cat_id=3 /ผลิตภัณฑ์/ผลิตภัณฑ์ทาก-2

หน้าผลิตภัณฑ์ใหม่ไม่มีรหัสใน URL ดังนั้นฉันจึงแสดงรายการทั้งหมดด้วยตนเอง และมีเพียง 5 หมวดหมู่และหน้าผลิตภัณฑ์ทั้งหมด 20 หน้า

นี่คือสิ่งที่ฉันได้ลองก่อนที่จะรู้ว่าซ้อนกันหากไม่ได้รับการสนับสนุน

ที่ตั้ง / {
    ถ้า ($arg_p = ผู้ติดต่อ) { ส่งคืน 301 /contact; }
    ถ้า ($arg_p = คงที่) { 
        ถ้า ($arg_id = อาชีพ) { กลับ 301 /อาชีพ; }
        # เพจสแตติกอื่นเปลี่ยนเส้นทางไปที่ /about
        กลับ 301 /เกี่ยวกับ;
    }

    ถ้า ($arg_p = แค็ตตาล็อก) {
        ถ้า ($arg_action = รูปภาพ) {
            ถ้า ($arg_cat_id = 1) { ส่งคืน 301 /product-category/category-slug-1; }
            ถ้า ($arg_cat_id = 2) { ส่งคืน 301 /product-category/category-slug-2; }
            อีก # หมวดหมู่ที่ไม่แสดงควรเปลี่ยนเส้นทางไปยัง /product-categories
            ส่งคืน 301 /หมวดสินค้า;
        }
        ถ้า ($arg_action = viewimages) {
            ถ้า ($arg_pid = 1) { ส่งคืน 301 /product/product-slug-1/; }
            ถ้า ($arg_pid = 2) { ส่งคืน 301 /product/product-slug-2/; }
        }
        # ลิงก์ที่ไม่แสดงอื่น ๆ มีค่าเริ่มต้นเป็น /product
        ส่งคืน 301 /ผลิตภัณฑ์;
    }
}

การกำหนดค่าควรเป็นอย่างไร

Score:2
ธง gr

คุณสามารถทำได้ด้วยการล่ามโซ่หลายอัน แผนที่ บล็อก นี่คือแนวคิด:

แผนที่ $arg_p $url_p {
    ติดต่อ / ติดต่อ;
    $url_id แบบคงที่;
    แค็ตตาล็อก $url_action;
    # ค่าเริ่มต้นจะเป็นสตริงว่าง
}

แผนที่ $arg_id $url_id {
    อาชีพ / อาชีพ;
    เกี่ยวกับ / เกี่ยวกับ;
    # เพจสแตติกอื่นเปลี่ยนเส้นทางไปที่ /about
    ค่าเริ่มต้น / เกี่ยวกับ;
}

แผนที่ $arg_action $url_action {
    รูปภาพ $url_cat_id;
    ดูภาพ $url_pid;
    การกระทำที่ไม่แสดงอีก # รายการมีค่าเริ่มต้นเป็น /product
    ค่าเริ่มต้น / ผลิตภัณฑ์;
}

แผนที่ $arg_cat_id $url_cat_id {
    1 /หมวดสินค้า/หมวดทาก-1;
    2 /หมวดสินค้า/หมวดทาก-2;
    อีก # หมวดหมู่ที่ไม่แสดงควรเปลี่ยนเส้นทางไปยัง /product-categories
    ค่าเริ่มต้น /หมวดสินค้า;
}

แผนที่ $arg_pid $url_pid {
    1 /ผลิตภัณฑ์/ผลิตภัณฑ์ทาก-1;
    2 /ผลิตภัณฑ์/ผลิตภัณฑ์ทาก-2;
    สินค้าที่ไม่อยู่ในรายการอีก # รายการมีค่าเริ่มต้นเป็น /product
    ค่าเริ่มต้น / ผลิตภัณฑ์;
}

เซิร์ฟเวอร์ {
    ฟัง ...
    ชื่อเซิร์ฟเวอร์ ...
    ...
    if ($url_p) { # ถ้าตัวแปร '$url_p' ไม่ใช่สตริงว่าง
        ส่งคืน 301 $url_p;
    }
    ที่ตั้ง / {
        ...
    }
    ...
}

บาง แผนที่ บล็อกสามารถย่อได้ ตัวอย่างเช่น สมมติว่าคุณมีหน้าสแตติก 3 หน้า /อาชีพ, /ลูกค้า และหน้า "เริ่มต้น" /เกี่ยวกับ, 5 หมวดหมู่ และ 45 ผลิตภัณฑ์:

แผนที่ $arg_id $url_id {
    ~^(อาชีพ|ลูกค้า)$ /$1;
    ค่าเริ่มต้น / เกี่ยวกับ;
}

แผนที่ $arg_cat_id $url_cat_id {
    ~^([1-5])$ /product-category/category-slug-$1;
    ค่าเริ่มต้น /หมวดสินค้า;
}

แผนที่ $arg_pid $url_pid {
    ~^([1-9]|[1-3]\d|4[0-5])$ /product/product-slug-$1;
    ค่าเริ่มต้น / ผลิตภัณฑ์;
}

อัปเดต

OP ระบุว่าเขาไม่สามารถใช้งานได้ แผนที่ คำสั่งเนื่องจากเขาไม่มีสิทธิ์เข้าถึงการกำหนดค่า nginx แบบเต็ม แต่ทำได้เท่านั้น เซิร์ฟเวอร์ บล็อกเนื้อหาแม้ว่าโซลูชันก่อนหน้านี้จะสวยงามกว่ามาก (และควรมีประสิทธิภาพมากกว่าในแง่ของประสิทธิภาพ) แต่ก็เป็นไปได้ที่จะทำเช่นเดียวกันโดยใช้เท่านั้น ถ้า บล็อก:

ถ้า ($arg_p = ผู้ติดต่อ) { ส่งคืน 301 /contact; }

ถ้า ($arg_p = คงที่) { ตั้ง $page static_$arg_id; }
ถ้า ($page = static_career) { กลับ 301 /อาชีพ; }
ถ้า ($ หน้า) { กลับ 301 /เกี่ยวกับ; } # อะไรก็ตามที่ไม่ใช่ 'อาชีพ' เปลี่ยนเส้นทางไปที่ '/เกี่ยวกับ'

ถ้า ($arg_p = แค็ตตาล็อก) { ตั้ง $action $arg_action; }

ถ้า ($ action = รูปภาพ) { ตั้ง $page category_$arg_cat_id; }
ถ้า ($page = category_1) { ส่งคืน 301 /product-category/category-a; }
ถ้า ($page = category_2) { ส่งคืน 301 /product-category/category-b; }
# ...หมวดอื่นๆ
ถ้า ($ action = รูปภาพ) { ส่งคืน 301 / หมวดหมู่สินค้า; } # ระบุหมวดหมู่ที่ไม่แสดง

ถ้า ($action = viewimages) { set $page product_$arg_pid; }
ถ้า ($page = product_1) { ส่งคืน 301 /ผลิตภัณฑ์/ผลิตภัณฑ์-a; }
ถ้า ($page = product_2) { ส่งคืน 301 /ผลิตภัณฑ์/ผลิตภัณฑ์-b; }
# ... ผลิตภัณฑ์อื่น
ถ้า ($ action = viewimages) { ส่งคืน 301 / ผลิตภัณฑ์; } # ผลิตภัณฑ์ที่ไม่อยู่ในรายการที่ระบุ

# หากคุณต้องการดำเนินการใด ๆ ที่ไม่แสดงในรายการในลักษณะพิเศษ
# if ($action) { ... } # อาร์กิวเมนต์การค้นหา 'action' ไม่ใช่ 'images' หรือ 'viewimages'

ส่วนนี้สามารถวางได้ทั้งใน เซิร์ฟเวอร์ หรือ ที่ตั้ง บริบท.

in flag
ฉันได้รับ `nginx: ไม่อนุญาตให้ใช้คำสั่ง [emerg] "map" ที่นี่ ไม่สามารถใช้แผนที่ภายในบล็อก 'เซิร์ฟเวอร์' ได้หรือไม่ ฉันไม่สามารถแก้ไข nginx นอกบล็อก 'เซิร์ฟเวอร์'
in flag
พบคำถามเหล่านี้ https://stackoverflow.com/questions/27358804/ ดังนั้นฉันคิดว่าแผนที่ไม่ใช่ตัวเลือกสำหรับฉัน เป็นไปได้ไหมที่จะเขียนใหม่ (regex สำหรับพารามิเตอร์แบบสอบถามเก่า) (ลิงก์ใหม่) ฉันไม่เข้าใจเกี่ยวกับ regex มากนัก
in flag
นั่นเป็นเคล็ดลับที่ดีในการเชื่อมต่อพารามิเตอร์แบบสอบถามและจัดเก็บเป็นตัวแปร
Score:1
ธง in

ฉันลงเอยด้วยวิธีนี้

ที่ตั้ง / {
  ถ้า ($arg_p = ผู้ติดต่อ) { ส่งคืน 301 /contact; }
  ถ้า ($args ~ p=static&id=career) { กลับ 301 /อาชีพ; }
  ถ้า ($arg_p = คงที่) { กลับ 301 /เกี่ยวกับ; }
  ถ้า ($args ~ p=catalog&action=images&cat_id=1) { ส่งคืน 301 /product-category/category-a; }
  ถ้า ($args ~ p=catalog&action=images&cat_id=2) { ส่งคืน 301 /product-category/category-b; }
  # และ cat_id อื่น ๆ
  ถ้า ($args ~ p=catalog&action=viewimages&pid=1&cat_id=1) { ส่งคืน 301 /product/product-a; }
  ถ้า ($args ~ p=catalog&action=viewimages&pid=2&cat_id=1) { ส่งคืน 301 /product/product-b; }
  #และพิดอื่นๆ
  ถ้า ($arg_p = แคตตาล็อก) { ส่งคืน 301 /ผลิตภัณฑ์; } #other p=catalog มีค่าเริ่มต้นเป็น /products
  try_files $uri $uri/ /index.php$is_args$args;
}

ใช้งานได้ แต่ไม่สามารถจัดการกรณีที่ไม่ได้เขียนคำสั่งพารามิเตอร์แบบสอบถามไว้ด้านล่าง เช่น /?id=อาชีพ&p=คงที่ (id กับ p สลับไปมา)

อีกด้วย cat_id ใน p=catalog&action=viewimages ไม่ได้ใช้ แต่เมื่อฉันลบ cat_id จากกฎ p=catalog&action=viewimages&pid=10 มักจะเปลี่ยนเส้นทางไปที่ p=catalog&action=viewimages&pid=1ดังนั้นฉันจึงต้องใส่ cat_id.

หากมีใครมีความคิดที่ดีกว่าในการจัดการคำสั่งแบบไดนามิกสำหรับพารามิเตอร์การสืบค้น โปรดโพสต์เป็นคำตอบ ฉันจะทำเครื่องหมายว่ายอมรับหากได้ผล

แก้ไข: สำหรับพารามิเตอร์การสืบค้นคำสั่งแบบไดนามิกและสะอาดกว่ามาก ถ้า ดู คำตอบของ Ivan Shatsky

Ivan Shatsky avatar
gr flag
ดูการอัปเดตคำตอบของฉัน

โพสต์คำตอบ

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