Score:1

ป้องกันไม่ให้กฎ Regex ของ Nginx แทนที่กฎอื่น

ธง hm

ฉันมีเซิร์ฟเวอร์ Nginx ที่ทำหน้าที่เป็น reverse proxy สำหรับบริการสองสามอย่าง การกำหนดค่าคล้ายกับอันนี้

ตำแหน่ง / แบ็กเอนด์ / บริการ 1 {
        proxy_pass http://pathto/service1;
}

ที่ตั้ง / {
        ราก /a/โฟลเดอร์
}

ตำแหน่ง ~* (\.js|\.css)$
        หมดอายุ 8d;

        รูท /home/files/abc/bcd;
}

ปัญหาของฉันที่นี่คือเมื่อเร็ว ๆ นี้ service1 จากแบ็กเอนด์ต้องให้บริการไฟล์คงที่สองสามไฟล์เช่น /backend/service1/something/file1.js หรือ /backend/service1/something/style.css และตำแหน่งที่สอง เนื่องจากเป็นกฎตำแหน่ง regex จึงแทนที่ตำแหน่งแรก

ไฟล์สแตติกทั้งหมดที่มีให้โดยแบ็กเอนด์/service1 มีคำนำหน้า (บางสิ่งบางอย่าง) ดังนั้นฉันจึงพยายามปรับปรุง regex จากตำแหน่งที่สองเพื่อให้มี lookahead/lookbehind เชิงลบ แต่ดูเหมือนจะไม่ทำงาน อาจเป็นเพราะรูปแบบหลักต้องมีความยาวคงที่ (นี่คือสิ่งที่ฉันพยายามโดยไม่มีโชค)

ตำแหน่ง / แบ็กเอนด์ / บริการ 1 {
        proxy_pass http://pathto/service1;
}

ที่ตั้ง / {
        ราก /a/โฟลเดอร์
}

ตำแหน่ง ~* (?<!something)(.*)(\.js|\.css)$
        หมดอายุ 8d;

        รูท /home/files/abc/bcd;
}

ฉันจะบรรลุสิ่งนี้ได้อย่างไร

jp flag
https://nginx.org/en/docs/http/ngx_http_core_module.html#location
RabidTunes avatar
hm flag
ฉันตรวจสอบเอกสารแล้ว แต่หลังจากตรวจสอบเป็นครั้งที่สาม ฉันพบวิธีแก้ไข โปรดดูคำตอบของฉันด้านล่าง ขอบคุณ ฉันเดาว่า
Score:3
ธง jp

หาก "บางสิ่ง" ตามมาทันที /แบ็กเอนด์/บริการ1คุณสามารถเพิ่มรายการอื่นที่เฉพาะเจาะจงมากขึ้นได้ ที่ตั้ง ที่มีความสำคัญเหนือตำแหน่ง regex:

ตำแหน่ง / แบ็กเอนด์ / บริการ 1 {
    proxy_pass http://pathto/service1;
}  
ที่ตั้ง ^~ /backend/service1/something/ {
    proxy_pass http://pathto/service1/something/;
}  
ตำแหน่ง ~* \.(js|css)$ { ... }

หาก "บางสิ่ง" ฝังอยู่ที่ใดก็ได้ใน URL คุณจะต้องใช้นิพจน์ทั่วไป โดยอาจใช้ร่วมกับ ฉาวโฉ่ มองไปข้างหน้าในแง่ลบ จากการลองผิดลองถูก ฉันพบนิพจน์ที่ใช้งานได้:

ตำแหน่ง ~* ^(?!.*something).*\.(js|css)$ { ... }
Score:0
ธง hm

ฉันยอมรับคำตอบอื่น แต่สิ่งที่ใช้ได้กับกรณีของฉันคือซ้อนตำแหน่งที่มี regex อะไรทำนองนี้

ตำแหน่ง / แบ็กเอนด์ / บริการ 1 {
        proxy_pass http://pathto/service1;
}

ที่ตั้ง / {
        ที่ตั้ง / {
            ราก /a/โฟลเดอร์
        }

        ตำแหน่ง ~* (\.js|\.css)$
            หมดอายุ 8d;

            รูท /home/files/abc/bcd;
        }
}

ด้วยวิธีนี้ หาก URI ปลายทางนำหน้าด้วย /backend/service1 ตำแหน่งแรกจะทริกเกอร์ สำหรับตำแหน่งอื่นๆ ตำแหน่ง / จะทริกเกอร์ จากนั้น regex จะมีผล

Richard Smith avatar
jp flag
โซลูชันนี้ไม่ตอบคำถามของคุณ และเหมือนกับการใช้ `location ^~ /backend/service1`
RabidTunes avatar
hm flag
ทำไมคุณถึงบอกว่ามันไม่ตอบคำถามของฉัน? ฉันแก้ไขปัญหาของฉันแล้ว ผิดไหม? จะให้ฉันมีปัญหาในอนาคต?
RabidTunes avatar
hm flag
ฉันจะลองวิธีแก้ปัญหาของคุณในภายหลังเพราะมันง่ายกว่า และถ้าได้ผล ฉันจะยอมรับคำตอบของคุณแทนฉัน แต่จริงๆ แล้วฉันได้แก้ไขปัญหาด้วยแนวทางของฉันแล้ว ดังนั้นฉันจึงไม่เข้าใจความคิดเห็นของคุณ
Richard Smith avatar
jp flag
ฉันไม่ได้บอกว่ามันไม่ได้แก้ปัญหาของคุณ และเป็นเรื่องดีที่คุณพบวิธีแก้ปัญหาที่เหมาะกับคุณ แต่คำถามที่คุณโพสต์ไปยัง SF ถามเกี่ยวกับคำนำหน้า "บางสิ่ง" โดยเฉพาะ และคำตอบนี้ไม่ได้กล่าวถึงเรื่องนั้น
RabidTunes avatar
hm flag
โซลูชันของคุณใช้ได้ผลและง่ายกว่า ดังนั้นฉันจึงยอมรับและแก้ไข ขอบคุณ!

โพสต์คำตอบ

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