ฉันไม่ได้เขียนบทความทางเทคนิคมานานแล้ว หากคุณไม่เข้าใจ โปรดอ่านบทความเพิ่มเติมหรือตอบกลับในตอนท้ายของบทความ (นี่เป็นวิธีที่มีประสิทธิภาพที่สุด) เพื่อช่วยคุณตอบข้อสงสัยของคุณ
ฉันมาที่นี่ เพื่อค้นหาบทความนี้ ทุกคนควรรู้ว่าชื่อโดเมนระดับที่สองคืออะไร ดังนั้นฉันจะไม่พูดเรื่องไร้สาระ แต่ก่อนที่จะพูดคุย คุณต้องเข้าใจประเด็นทางอุดมคติก่อน
ปัญหาที่เพื่อนหลายคนคิดไม่ออก (ฉันเองก็คิดไม่ออกเมื่อไม่กี่วันก่อนเช่นกัน) คือหลังจากที่ฉันพิมพ์ที่อยู่แล้วเหตุใด URL จึงถูกเขียนใหม่
ขั้นตอนที่ 1: พิมพ์ที่อยู่ในเบราว์เซอร์ เช่น http://blog.downcodes.com แล้วคลิก Enter จะเกิดอะไรขึ้น
เพื่อให้ปัญหาง่ายขึ้น ให้ฉันอธิบายดังนี้:
ขั้นตอนที่ 2: ขั้นแรก ที่อยู่ที่พิมพ์จะถูกแยกวิเคราะห์และในที่สุดก็มาถึงเว็บเซิร์ฟเวอร์ ในโลก .net IIS จะส่งมอบคำขอดังกล่าวให้กับเว็บโปรเซสเซอร์เพื่อการประมวลผล ตัวประมวลผลเว็บส่งคืนผลการประมวลผลไปยังเบราว์เซอร์และแสดงให้ผู้ใช้เห็น
โปรดอย่าเพิกเฉยต่อปัญหานี้ ทุกอย่างในขั้นตอนที่สองเสร็จสิ้นบนฝั่งเซิร์ฟเวอร์ เมื่อสิ่งเหล่านี้เกิดขึ้น ที่อยู่บนเบราว์เซอร์ของลูกค้าจะไม่เปลี่ยนแปลง แม้ว่าตัวประมวลผลเว็บจะส่งคืนผลลัพธ์การประมวลผลในเวลาสิ้นสุดก็ตาม ที่อยู่ข้างต้นจะไม่เปลี่ยนแปลง
URL ที่คุณพิมพ์ตอนต้นจะทำหน้าที่เป็นเสียงเคาะประตูเท่านั้น เมื่อเคาะประตูแล้ว ฟังก์ชันจะสิ้นสุดลง มีเพียงดวงตาของคุณเท่านั้นที่มองเห็นที่อยู่นี้
ปัญหาที่ต้องเข้าใจคือสิ่งที่เรียกว่าการเขียน URL ใหม่เป็นเพียงเรื่องราวภายในที่นักพัฒนาเว็บรู้จักเท่านั้น ผู้ใช้ไม่รู้ว่าเกิดอะไรขึ้น เขาคิดว่าที่อยู่ที่เขาพิมพ์เป็นผลลัพธ์ที่ควรแสดง กล่าวอีกนัยหนึ่งคือ เราควบคุมสิ่งที่แสดงอยู่เบื้องหลัง
สิ่งต่อไปที่ต้องพิจารณาคือจะควบคุมเนื้อหาที่แสดงได้อย่างไร
จากกระบวนการที่กล่าวมาข้างต้น เห็นได้ชัดว่าการทำงานของตัวประมวลผลเว็บจำเป็นต้องได้รับการจัดการ
หนึ่งในข้อควรพิจารณาที่ง่ายที่สุดคือผู้ใช้ป้อนที่อยู่แบบธรรมดาโดยไม่มีพารามิเตอร์ใดๆ http://blog.downcodes.com จากนั้นเรา เปลี่ยนที่อยู่นี้เป็นที่อยู่ที่มีพารามิเตอร์ที่ตรงกับความต้องการของโปรแกรม http://kerry.com?lover=notus และสุดท้ายก็ดำเนินการ
สิ่งที่เรียกว่าการเขียน URL ใหม่อยู่ในขั้นตอนนี้
ในแง่ .net เราจำเป็นต้องลงทะเบียน httpmodule เพื่อให้แอปพลิเคชันจัดการ URL ที่เฉพาะเจาะจง
ลงทะเบียน httpmodule ใน web.config
นั้นเทียบเท่ากับโปรแกรมนี้
ในโปรแกรม httpmodule ที่เรามีให้
// ใช้โปรแกรม httpmodule ของเราเพื่อสกัดกั้น URL ดั้งเดิม
สตริง OriginalUrl=” http://blog.downcodes.com ”;
//ประมวลผล URL ดั้งเดิมและรับ URL ที่ต้องการสุดท้าย ค่าคือ http://kerry.com?lover=notus
สตริง FinalUrl=เขียนใหม่ (OriginalUrl);
// บริบทส่ง url ภายในไปยัง IIS อีกครั้งเพื่อประมวลผล
context.RewritePath(FinalUrl);
ต่อไป เราใช้การเขียน URL ใหม่
ไว้
ในโปรแกรมเว็บและเริ่มทำงาน
. และการใช้การเขียน url ใหม่เพื่อใช้ชื่อโดเมนระดับที่สอง กระบวนการจะเหมือนกัน เพราะไม่ว่าจะเป็นชื่อโดเมนระดับที่สองหรือชื่อโดเมนระดับที่สาม ตราบใดที่เราสกัดกั้น ที่อยู่ URL นี้เราสามารถจัดการได้ในระหว่างการประมวล
ผล งานเหล่านี้ค่อนข้างยุ่งยาก แต่มีผู้เชี่ยวชาญบนอินเทอร์เน็ตที่เขียนโปรแกรมดังกล่าวให้เรา โปรดดูบทความต่อไปนี้:
http://www.microsoft.com/ china/msdn/library/webservices/asp.net/URLRewriting.mspx
http:// /www.cnblogs.com/jzywh/archive/2005/09/29/246650.html
http://www.cnblogs.com/jzywh/ archive/2006/02/20/334004.html
บทความนี้จบลงแล้ว
ในกระบวนการนำไปใช้งาน คุณจะพบกับปัญหาบางประการ ซึ่งส่วนใหญ่เกิดจากการไม่อ่านบทความข้างต้นอย่างละเอียด แต่บอกตามตรงว่าไม่ใช่เรื่องง่ายที่จะอ่านเช่นนั้น บทความยาวๆ ให้ฉันบันทึกคำถามสำคัญๆ ไว้ด้านล่าง สองคำถามสุดท้าย ใช้โค้ดเฉพาะเพื่อแสดงวิธีจัดการกับ URL เป้าหมายที่เขียนใหม่เพื่อให้ตรงตามข้อกำหนดของเรา
URLRewriter ของ Microsoft คืออะไร ฉันจะดาวน์โหลดโครงการนี้ได้ที่ไหน
นี่คือโปรแกรมตัวอย่างที่ให้ไว้ในบทความเกี่ยวกับ msdn ที่แนะนำ URLRewriter ซึ่งสามารถดาวน์โหลดได้ที่นี่
http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx
วิธีใช้รหัสเหล่านี้ยุ่งยากหรือไม่?
เพื่อให้แน่ใจว่าไม่ใช่เรื่องยุ่งยาก ต่อไปนี้เป็นสิ่งที่ต้องทำ:
ดาวน์โหลดรหัสลงในเครื่องของคุณ
หลังจากการติดตั้ง ให้เพิ่มโปรเจ็กต์ URLRewriter ให้กับโปรเจ็กต์ของคุณเอง ทำตามวิธีการในที่อยู่ที่ให้ไว้ข้างต้น แก้ไขการกำหนดค่าโค้ด web.config และเริ่มใช้งาน
httpmodule คืออะไร
ความเข้าใจง่ายๆ ก็คือ มันเป็นโปรแกรมที่ประมวลผลคำขอ http สำหรับความเข้าใจโดยละเอียด โปรดดูที่เอกสารประกอบ sdk
จะใช้การแก้ไขแพนได้อย่างไร
ขั้นแรก ให้เพิ่มชื่อโดเมนระดับที่สองของ *.kerry.com ไปยังผู้ให้บริการชื่อโดเมน โดยชี้ไปที่ IP เซิร์ฟเวอร์ของคุณ
จากนั้น สร้างไซต์ใน IIS ปล่อยให้ส่วนหัวของโฮสต์ของไซต์นี้ว่างไว้ และพอร์ตทั่วไปคือ 80 ไซต์นี้เป็นเว็บไซต์เริ่มต้นสำหรับพอร์ตเซิร์ฟเวอร์ทั้งหมด 80
เพิ่มการแมปแอปพลิเคชันตัวแทนไปยังไซต์นี้ (คุณสมบัติของไซต์ IIS->โฮมไดเร็กทอรี->การกำหนดค่า) วัตถุประสงค์ของการแมปนี้คือเพื่อให้ asp.net ISAPI เข้าควบคุมไซต์ชื่อโดเมนรองใด ๆ ที่ไม่ได้ระบุไว้ใน IIS
จะเกิดอะไรขึ้นเมื่อคุณป้อนชื่อโดเมนระดับที่สอง?
เมื่อ IIS ตรวจพบว่า URL ขาเข้าเป็นชื่อโดเมนระดับที่สอง ขั้นแรกจะตรวจสอบว่ามีไซต์ที่ลงทะเบียนด้วยชื่อโดเมนระดับที่สองนี้บน IIS หรือไม่ หากเป็นเช่นนั้น จะถ่ายโอนไปยังไซต์นี้ มิฉะนั้น จะถูกถ่ายโอน ไปยังไซต์เริ่มต้น ไซต์เริ่มต้นนี้คือไซต์ที่มีส่วนหัวของโฮสต์ที่กำหนดค่าไว้ก่อนหน้านี้ซึ่งว่างเปล่า ดังนั้น พอร์ตสามารถมีไซต์เดียวเท่านั้นที่มีส่วนหัวของโฮสต์ว่าง
เราได้ตั้งค่า asp.net ISAPI เพื่อดูแลเด็กจรจัดเหล่านี้ เขียนโปรแกรมเพื่อวิเคราะห์ URL ที่เข้ามาและดำเนินการเขียนใหม่
เหตุใด httpmodule ของฉันจึงไม่ทำงาน
หลังจากตั้งค่าเบรกพอยต์ในโปรแกรม httpmodule ไม่ว่าอย่างไรก็ตาม กระบวนการจะไม่ไปจากที่นี่ เหตุผลก็คือ คุณยังไม่ได้ลงทะเบียนโปรแกรม httpmodule ของคุณกับโปรแกรมเว็บ เสร็จสิ้นใน web.config เสร็จสิ้นใน
<system.เว็บ>
<httpโมดูล>
<add type="URLRewriter.ModuleRewriter, URLRewriter" name="ModuleRewriter" />
</httpโมดูล>
</system.เว็บ>
เหตุใดฉันจึงได้รับแจ้งด้วย "ข้อผิดพลาด RewriterConfig ส่วนการกำหนดค่าที่ไม่รู้จัก"
เนื่องจากคุณยังไม่ได้ลงทะเบียนส่วนการกำหนดค่า RewriterConfig กับโปรแกรมเว็บ
<configSections>
<ชื่อส่วน = "RewriterConfig" type = "URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
</configSections>
จากนั้น คุณสามารถกำหนดค่ากฎได้โดยใช้ส่วน RewriterConfig ใน <configuration>
ส่วนใดของ httpmodule ที่ถูกประมวลผล
งานส่วนใหญ่อยู่ในเมธอด URLRewriter
ถ้า (re.IsMatch (requestedPath))
แน่นอนว่าสิ่งนี้กำหนดว่า URL ที่เข้ามานั้นเป็น URL ที่เราต้องการเขียนใหม่หรือไม่
สตริง sendToUrl = RewriterUtils.ResolveUrl (app.Context.Request.ApplicationPath, re.Replace (requestedPath, กฎ [i] .SendTo));
ได้รับ URL เป้าหมายที่กำหนดค่าใน web.config ที่นี่
RewriterUtils.RewriteUrl (app.Context, sendToUrl);
เขียน url ใหม่ภายใน
ฉันไม่ต้องการฮาร์ดโค้ดชื่อโดเมนระดับที่สองใน web.config และ URL เป้าหมายที่ฉันต้องการเขียนใหม่ไม่สามารถฮาร์ดโค้ดได้ ตัวอย่างเช่น หากเราต้องการเช่นนั้น
หน้าการประมวลผลจริงของ blog.downcodes.com คือ kerry.com/action.aspx?id=1
หน้าการประมวลผลจริงของ call.kerryl.com คือ kerry.com/action.aspx?id=2
หน้าดำเนินการจริงของ walkwith.kerry.com คือ kerry.com/walk.aspx
จะจัดการกับมันอย่างไร?
ในเวลานี้ คุณต้องทำการเปลี่ยนแปลงบางอย่างในโค้ดที่กล่าวถึงข้างต้น
ถ้า (re.IsMatch (requestedPath))
{
//ค้นหาชื่อโดเมนระดับที่สองใน URL
สตริง [] UserHost = app.Request.Url.Host.Split ( Char ใหม่ [] { '.' } );
string domain2=UserHost [0];
//ตั้งค่า URL เป้าหมายให้เขียนใหม่ตามต้องการ
สตริง sendToUrl;
ถ้า (domain2==”ความรัก”)
sendToUrl =”/action.aspx?id=1”;
อย่างอื่นถ้า (domain2==” โทร”)
sendToUrl =”/action.aspx?id=2”;
อย่างอื่นถ้า (domain2==”walkwith”)
sendToUrl =”/walk.aspx”;
RewriterUtils.RewriteUrl(app.Context, sendToUrl);
}
เมื่อกำหนดค่ากฎใน web.config คุณต้องดำเนินการนี้
<กฎนักเขียนใหม่>
<LookFor>http://(w+).kerry.com</LookFor>
<SendTo>/test.aspx</SendTo>
</กฎนักเขียนใหม่>
(w+) ใช้เพื่อจับคู่สตริงใดๆ คุณสามารถเขียนอย่างอื่นใน test.aspx ได้ที่นี่ เพราะเราไม่ได้ใช้มันเลย
ฉันมีไซต์หลายแห่งที่มีชื่อโดเมนระดับที่สองไม่แน่นอน แต่หน้าของแต่ละไซต์ถูกกำหนดไว้แล้ว จริงๆ แล้วเนื้อหาของแต่ละไซต์ชื่อโดเมนระดับที่สองจะถูกดึงมาจากฐานข้อมูลตามรหัสที่แตกต่างกัน
สถานการณ์เป็นเช่นนี้
http://localhost/kerry/action.aspx?id=1 blog.downcodes.com/walk.aspx
http://localhost/kerry/action.aspx?id=14 like.kerry.com/walk.aspx
ผ่านเลย เมื่อฉันขึ้นไป ไม่สามารถแสดงพารามิเตอร์ id ได้และเปลี่ยนเป็นชื่อโดเมนระดับที่สอง ฉันควรทำอย่างไรใน
การกำหนดค่ากฎก่อน
<กฎนักเขียนใหม่>
<LookFor>http://(w+).kerry .com walk.aspx</LookFor>
<SendTo>/action.aspx</SendTo>
</กฎนักเขียนใหม่>
แล้วจัดการแบบนี้ในโปรแกรม
// รับชื่อโดเมนระดับที่สอง
สตริง [] UserHost = app.Request.Url.Host.Split ( Char ใหม่ [] { '.' } );
สตริงโดเมน2=โฮสต์ผู้ใช้ [0];
รับหมายเลขที่แตกต่างกันตามชื่อโดเมน
int id=getIDfromDomain(โดเมน2);
//รับ URL พื้นฐานที่จะเปลี่ยนเส้นทาง
string sendToUrl = RewriterUtils.ResolveUrl (app.Context.Request.ApplicationPath, re.Replace (requestedPath, กฎ [i] .SendTo));
//เพิ่มพารามิเตอร์รหัส
ถ้า(id>0)
sendToUrl=string.Format ( "{0}?id={1}" , sendToUrl , id );
อื่น
sendToUrl=”error.aspx”;
//เขียนใหม่
RewriterUtils.RewriteUrl(app.Context, sendToUrl);
ฉันค้นหาออนไลน์และมีวิธีแก้ไขอื่น ...
บางทีคุณอาจอ้างถึงบทความนี้
http://blog.csdn.net/mengyao/archive/2007/01/25/ 1493537 .aspx
อย่างที่คุณเห็นวิธีการพื้นฐานเหมือนกัน สาเหตุที่ไม่แสดงไว้ที่ด้านบนสุดก็เพราะวิธีนี้ค่อนข้างยุ่งยากและอาจเข้าใจได้ไม่ง่ายในตอนแรก แต่ฉันเชื่อว่าเพื่อนๆ ที่เคยเห็น ในตอนท้ายการอ่านบทความนี้อีกครั้งอาจทำให้คุณยิ้มได้อย่างรู้เท่าทัน
การเขียนโปรแกรมที่มีความสุข
ป.ล. สุดท้าย: ฉันวางแผนที่จะเผยแพร่บทความนี้ในอีกไม่กี่วัน แต่ตอนนี้ฉันลบโปรแกรมทั้งหมดที่ฉันเขียนเมื่อไม่กี่วันที่ผ่านมาออกจาก VSS โดยไม่ได้ตั้งใจ มันยังคงเป็นประเภทที่สมบูรณ์อีกครั้ง ฉันดูถูกขยะนี้อย่างยิ่ง ตัวจัดการซอร์สโค้ดที่สร้างโดย Microsoft-_ -