ฉันจะสร้างตำแหน่งใน nginx ที่ทำงานกับและไม่มีเครื่องหมายทับได้อย่างไร


46

ตอนนี้ฉันมีการกำหนดค่านี้:

location ~ ^/phpmyadmin/(.*)$
{
        alias /home/phpmyadmin/$1;
}

อย่างไรก็ตามถ้าฉันไปเยี่ยมwww.mysite.com/phpmyadmin(สังเกตว่าไม่มีรอยต่อท้าย) จะไม่พบสิ่งที่ฉันกำลังมองหา 404 ฉันคิดว่าเพราะฉันไม่ได้รวมเครื่องหมายทับ ฉันจะแก้ไขสิ่งนี้ได้อย่างไร


2
ฉันรู้ว่าคำถามนี้ค่อนข้างเก่ากระนั้นฉันอยากจะเน้นไปที่ความจำเป็นที่จะต้องเปลี่ยนคำตอบที่ได้รับการยอมรับ ผู้ใช้ที่ไม่มีประสบการณ์ (ผู้ที่จะค้นหา QAs ประเภทนี้) อาจสร้างช่องโหว่ด้านความปลอดภัยโดยใช้คำตอบที่ยอมรับในปัจจุบัน
Bozzy

คำตอบ:


34

อาจอยู่ในนิพจน์ทั่วไปที่คุณใช้ -

location ~ ^/phpmyadmin/(.*)$

ด้านบนจะตรงกับ / phpmyadmin /, / phpmyadmin / อะไร / อื่น / ที่นี่ แต่จะไม่ตรงกับ / phpmyadmin เพราะการแสดงออกปกติรวมถึงการต่อท้ายทับ

คุณอาจต้องการสิ่งนี้:

location ~ /phpmyadmin/?(.*)$ {
    alias /home/phpmyadmin/$1;
}

เครื่องหมายคำถามเป็นตัวบ่งชี้การแสดงออกปกติและควรบอก nginx ให้ตรงกับศูนย์หรือหนึ่งในตัวละครก่อนหน้า (เครื่องหมายทับ)

คำเตือน:ชุมชนเห็นวิธีแก้ไขปัญหานี้เช่นเดียวกับความเสี่ยงด้านความปลอดภัยที่อาจเกิดขึ้น


ขอขอบคุณ! และขอขอบคุณสำหรับคำอธิบายเช่นกัน จะมีประโยชน์ในอนาคต
Rob

15
รูปแบบไม่ถูกต้องนัก นอกจากนี้ยังสามารถจับคู่เส้นทางเช่น "/ phpmyadmin1234" แน่นอนว่าไม่ใช่สิ่งที่คุณต้องการ โซลูชันของ @ kbec เป็นวิธีที่ถูกต้อง
Meow

3
ฉันขอโทษสำหรับการลดระดับลงอย่างชัดเจน แต่ความเห็นของ @Meow เป็นวิธีที่สำคัญในการละเลย สิ่งนี้สามารถนำไปสู่เว็บเซิร์ฟเวอร์ที่กำหนดค่าผิดพลาดซึ่งอาจมีช่องโหว่ด้านความปลอดภัย
Daniel F

34

ทางออกที่ดีกว่า:

location ~ ^/phpmyadmin(?:/(.*))?$ {
    alias /home/phpmyadmin/$1;
}

ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์มีสิทธิ์/home/phpmyadminก่อน


คำอธิบายความแตกต่างกับคำตอบที่ยอมรับได้:

มันเป็นเรื่องของการแสดงออกปกติ

ก่อนอื่น^ถ่านหมายความว่าคุณต้องการจับคู่ตั้งแต่เริ่มต้นของสตริงและไม่อยู่ตรงกลาง $ที่หมายถึงการสิ้นสุดที่ตรงไปยังจุดสิ้นสุดของสตริง

กลุ่มที่(?:)ไม่ใช่การจับภาพหมายถึง - เราไม่ต้องการให้อยู่ในผลลัพธ์การจับภาพ แต่เราต้องการจัดกลุ่มตัวอักษรง่ายๆ เราจัดกลุ่มอย่างนี้เพราะเราต้องการให้/ถ่านเป็นส่วนที่ไม่มีความสำคัญของเส้นทางเด็กและไม่ใช่ส่วนสำคัญของเส้นทางผู้ปกครอง


ทำไมจะดีกว่า
Meekohi

2
@Meow ตอบคำถามนี้ในคำตอบที่ได้รับการยอมรับ
kbec

2
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ
Yonn Trimoreau

@Meekohi ฉันเขียนคำอธิบาย
kbec

8

ทำไมคุณไม่ลองใช้

location /phpmyadmin {
    alias /home/phpmyadmin;
}

?


เพราะนั่นไม่ได้ผลสำหรับฉัน ดูที่นี่: serverfault.com/questions/375602/…
Rob

1
@Rob คุณลองโดยไม่ใช้เครื่องหมายทับต่อท้ายกับaliasคำสั่งหรือไม่?
Shane Madden

นี่เป็นคำตอบที่ถูกต้องและเป็นวิธีที่ถูกต้อง เพียงไม่รวมเครื่องหมายสแลชและทำงานเพื่อ URL ที่พิมพ์ทั้งที่มีและไม่มีสแลชต่อท้าย ไม่จำเป็นต้องซับซ้อนอะไรบน Nginx ทำให้มันง่าย regex ที่ซับซ้อนและเรื่องตลกอื่น ๆ จะทำให้ Nginx ช้าลงเท่านั้น
MitchellK

4
ปัญหาของเรื่องนี้ก็คือมันจะจับคู่/phpmyadminblahblahblahblahหรือรวมกันอื่น ๆ
แกรี่กรีน

6

ฉันรู้ว่านี่เป็นคำถามเก่า แต่สำหรับใครก็ตามที่ลงเอยด้วย Google ฉันแก้ไขมันด้วยวิธีต่อไปนี้ (รูปแบบของ @ kbec's ซึ่งค่อนข้างดี):

location ~ ^/foo(/.*)?$ {
  proxy_pass http://$backend$1$is_args$args
}

การดำเนินการนี้จะจับรูปแบบใด ๆ ของ/fooและเปลี่ยนเส้นทางไป/barยัง URL อื่น (รวมถึงพารามิเตอร์) ฉันกำลังแสดงให้เห็นว่ามันมีproxy_passคำสั่ง aliasแต่ก็ยังจะทำงานร่วมกับ

  • /foo -> /bar
  • /foo/ -> /bar/
  • /foo/sub -> /bar/sub
  • /foo/sub1/sub2/?param=value -> /bar/sub1/sub2/?param=value

มันทำงานได้เพราะ$1เลือกที่จะจับ subresources /fooextra/บวกเฉือนชั้นนำดังนั้นมันจะไม่จับสิ่งที่ต้องการ นอกจากนี้ยังจะเปลี่ยนเส้นทางทับปัจจุบันหรือไม่ปัจจุบันอย่างถูกต้อง


1
ขอบคุณที่พิจารณากรณีมุมของการต้องการใช้ proxy_pass และดูแลข้อโต้แย้ง คุณมี upvote ของฉัน
Daniel F

2

การเปลี่ยนเส้นทางนี้จะเพียงเขียน URL ที่มีและไม่มีเฉือนท้าย สิ่งใดที่เกิดขึ้นหลังจากเครื่องหมายทับจะไม่ถูกเขียนทับ

domain.com/location => ถูกเปลี่ยนเส้นทางไปยัง domain.com/new/location
domain.com/location => ถูกเปลี่ยนเส้นทางไปยัง domain.com/new/location
domain.com/location/other => ไม่ได้เปลี่ยนเส้นทาง

server {
  # 301 URL Redirect
  rewrite ^/location/?$ /new/location permanent;
}



0

ทำไมไม่ใส่สอง rewrites ง่ายๆ:

location ~ ^/phpmyadmin
{
    rewrite /phpmyadmin /home/phpmyadmin/ break;
    rewrite /phpmyadmin/(.*) /home/phpmyadmin/$1 break;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.