mod_rewrite ถึง nginx เขียนกฎใหม่

ฉันได้แปลงกฎ mod_rewrite ของ Apache HTTPd ส่วนใหญ่ไปเป็นโมดูล HttpRewrite ของ nginx (ซึ่งเรียก PHP-FPM ผ่าน FastCGI ในทุกคำขอแบบไดนามิก) กฎง่ายๆ ที่กำหนดโดยสถานที่ที่ยากลำบากนั้นใช้ได้ผลดี:

location = /favicon.ico { rewrite ^(.*)$ /_core/frontend.php?type=ico&file=include__favicon last; }

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

mod_rewrite

# File handler
RewriteRule ^([a-z0-9-_,+=]+)\.([a-z]+)$ _core/frontend.php?type=$2&file=$1 [QSA,L]

# Page handler
RewriteRule ^([a-z0-9-_,+=]+)$   _core/frontend.php?route=$1 [QSA,L]
RewriteRule ^([a-z0-9-_,+=]+)\/$ _core/frontend.php?route=$1 [QSA,L]

RewriteRule ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)$   _core/frontend.php?route=$1/$2 [QSA,L]
RewriteRule ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/$ _core/frontend.php?route=$1/$2 [QSA,L]

RewriteRule ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)$   _core/frontend.php?route=$1/$2/$3 [QSA,L]
RewriteRule ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/$ _core/frontend.php?route=$1/$2/$3 [QSA,L]

ฉันคิดการกำหนดค่าเซิร์ฟเวอร์ต่อไปนี้สำหรับไซต์ แต่ฉันพบกฎที่ไม่ตรงกันหลังจากแยกวิเคราะห์คำขอ (เช่น GET /user/auth):

พยายามเขียน nginx ใหม่

location / {
    # File handler
    rewrite ^([a-z0-9-_,+=]+)\.([a-z]+)?(.*)$                                /_core/frontend.php?type=$2&file=$1&$3 break;

    # Page handler
    rewrite ^([a-z0-9-_,+=]+)(\/*)?(.*)$                                     /_core/frontend.php?route=$1&$2        break;
    rewrite ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)(\/*)?(.*)$                   /_core/frontend.php?route=$1/$2&$3     break;
    rewrite ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)(\/*)?(.*)$ /_core/frontend.php?route=$1/$2/$3&$4  break;
}

คุณจะแนะนำอะไรในการจัดการกับตัวจัดการไฟล์ของฉัน (ซึ่งก็คือ filename.ext) และตัวจัดการเพจของฉัน (ซึ่งเป็นคำขอเส้นทางเฉพาะที่มีคุณสมบัติสูงสุด 3 รายการที่กำหนดโดยเครื่องหมายทับ)

เนื่องจากฉันยังไม่ได้รับการตอบกลับจากสิ่งนี้ ฉันจึงไม่แน่ใจด้วยว่าสิ่งนี้จะแทนที่ตัวแยกวิเคราะห์ PHP ของฉันซึ่งกำหนดด้วย location ~ \.php {} ซึ่งรวมอยู่ก่อนกฎการเขียนใหม่เหล่านี้หรือไม่

คะแนนโบนัสหากฉันสามารถแก้ไขปัญหาการแยกวิเคราะห์ได้โดยไม่จำเป็นต้องใช้กฎใหม่สำหรับคุณสมบัติเส้นทางแต่ละจำนวน


person abestic9    schedule 31.07.2012    source แหล่งที่มา


คำตอบ (1)


ฉันลงเอยด้วยการเขียนกฎต่อไปนี้:

ตัวจัดการไฟล์

location ~ ^/([a-zA-Z0-9-_]*)\.([a-zA-Z0-9]*)$ { include /web/_config/php.conf; rewrite ^/([a-zA-Z0-9-_]*)\.([a-zA-Z0-9]*)$ /_core/frontend.php?type=$2&file=$1 last; }

ตัวจัดการไฟล์จะดึงชื่อและนามสกุลแล้วเขียนลงใน type={ext}&file={name}

ตัวจัดการเพจ

location ~ ^/([a-z0-9-_]*)$ { include /web/_config/php.conf; rewrite ^/([a-z0-9-_]*)$ /_core/frontend.php?route=$1 last; }
location ~ ^/([a-z0-9-_]*)/?([a-z0-9-_]*)$ { include /web/_config/php.conf; rewrite ^/([a-z0-9-_]*)/?([a-z0-9-_]*)$ /_core/frontend.php?route=$1/$2 last; }
location ~ ^/([a-z0-9-_]*)/?([a-z0-9-_]*)/?([a-z0-9-_]*)$ { include /web/_config/php.conf; rewrite ^/([a-z0-9-_]*)/?([a-z0-9-_]*)/?([a-z0-9-_]*)$ /_core/frontend.php?route=$1/$2/$3 last; }

ตัวจัดการเพจ (ซึ่งในกรณีนี้จะจัดการไดเร็กทอรีได้สูงสุด 3 "ไดเร็กทอรี") จะจับสตริงระหว่างตัวคั่นแต่ละตัว (/) ทำการตรวจสอบความถูกต้องของ regex และเขียนเป็นสตริงการสืบค้น

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

ฉันยังค้นพบว่า nginx ผนวกสตริงการสืบค้นตามค่าเริ่มต้น ดังนั้นจึงไม่จำเป็นต้องใช้ regex ซึ่งเป็นการปรับปรุงประสิทธิภาพอีกครั้ง

โปรดทราบว่า /web/_config/php.conf เป็นเพียงการกำหนดค่าแบบส่งผ่าน FastCGI และการกำหนดค่าที่มาพร้อมกับ nginx (ปกติคือ /etc/nginx/fastcgi.conf) น่าจะทำงานได้ดี โปรดทราบว่าหากคุณกำลังจัดการกับ PHP โดยเฉพาะ คุณไม่จำเป็นต้องกำหนดสิ่งนี้ในแต่ละกฎ เพียงแค่เติม include นำหน้าพวกมัน

หวังว่านี่จะช่วยได้

person abestic9    schedule 13.11.2012