لم أكتب مقالًا تقنيًا لفترة طويلة، إذا لم تفهمه، فما عليك سوى قراءة بعض المقالات الأخرى، أو الرد في نهاية المقالة (هذه هي الطريقة الأكثر فعالية). لمساعدتك في الإجابة على شكوكك،
جئت إلى هنا للعثور على هذه المقالة، يجب أن تعرفوا جميعًا ما هو اسم النطاق من المستوى الثاني، لذلك لن أتحدث عن هذا الهراء، ولكن قبل المناقشة، يجب عليك أولاً فهم مسألة أيديولوجية.
المشكلة التي لم يتمكن العديد من الأصدقاء من اكتشافها (لم أتمكن أيضًا من اكتشافها منذ بضعة أيام) هي أنه بعد كتابة عنوان، لماذا تتم إعادة كتابة عنوان URL؟
الخطوة 1: اكتب عنوانًا في المتصفح، مثل http://blog.downcodes.com ، ثم انقر فوق Enter ماذا يحدث؟
و لتبسيط المشكلة دعوني أشرحها كالتالي:
الخطوة 2: أولاً، يتم تحليل العنوان المكتوب ويأتي أخيرًا إلى خادم الويب ويتم تسليمه إلى IIS للمعالجة يقوم معالج الويب بإرجاع نتائج المعالجة إلى المتصفح ويعرضها للمستخدم.
من فضلك لا تتجاهل هذه المشكلة. كل شيء في الخطوة الثانية يتم من جانب الخادم. عندما تحدث هذه الأشياء، لن يتغير العنوان الموجود في متصفح العميل حتى لو قام معالج الويب بإرجاع نتيجة المعالجة في النهاية ، لن يتغير العنوان أعلاه.
عنوان URL الذي تكتبه في البداية يعمل فقط كطرق على الباب، بمجرد طرق الباب، تنتهي الوظيفة. لا يمكن للمتصفح أو الخادم أو ما إلى ذلك معرفة هذا العنوان.
المشكلة التي يجب فهمها هي أن ما يسمى بإعادة كتابة عنوان URL هو مجرد قصة داخلية معروفة لمطوري الويب. ليس لدى المستخدم أي فكرة عما يحدث، فهو يعتقد أن العنوان الذي يكتبه هو النتيجة التي يجب عرضها بمعنى آخر، نحن نتحكم في ما يتم عرضه خلف الكواليس.
والشيء التالي الذي يجب مراعاته هو كيفية التحكم في المحتوى المعروض؟
من العملية المذكورة أعلاه، من الواضح أن عمل معالج الويب يحتاج إلى التلاعب.
أحد أبسط الاعتبارات هو أن يقوم المستخدم بإدخال عنوان بسيط دون أي معلمات، http://blog.downcodes.com ثم نقوم بذلك. قم بتغيير هذا العنوان إلى عنوان بمعلمات تلبي احتياجات البرنامج، http://kerry.com?lover=notus ، وأخيرًا قم بمعالجته.
ما يسمى بإعادة كتابة عنوان url موجود في هذه الخطوة.
بمصطلحات .net، نحتاج إلى تسجيل httpmodule للتطبيق للتعامل مع عناوين URL محددة
قم بتسجيل httpmodule في web.config،
تعادل تقريبًا هذا البرنامج
في برنامج httpmodule الذي نقدمه
// استخدم برنامج httpmodule الخاص بنا لاعتراض عنوان URL الأصلي
String OriginalUrl=” http://blog.downcodes.com ”;
// قم بمعالجة عنوان url الأصلي واحصل على آخر عنوان url مطلوب، والقيمة هي http://kerry.com?lover=notus
String FinalUrl=Rewrite(OriginalUrl);
// يعيد السياق إرسال عنوان URL داخليًا إلى IIS للمعالجة
context.RewritePath(FinalUrl);
بعد ذلك، نقوم بتنفيذ إعادة كتابة عنوان URL.
الخطوة 1: تحديد عناوين URL التي يجب إعادة كتابتها، أي صياغة قواعد إعادة الكتابة. الخطوة 2: كتابة معالج httpmodule. الخطوة 3: دمج وحدة httpmodule المكتوبة في برنامج الويب وبدء العمل.
ما ورد أعلاه هو المعرفة الأساسية لإعادة كتابة عنوان url ، واستخدام إعادة كتابة عنوان 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.web>
<httpModules>
<add type="URLRewriter.ModuleRewriter, URLRewriter" name="ModuleRewriter" />
</httpModules>
</system.web>
لماذا تتم مطالبتي دائمًا برسالة "خطأ في قسم التكوين غير معروف في RewriterConfig"؟
هذا لأنك لم تقم بتسجيل قسم تكوين RewriterConfig في برنامج الويب. يجب إكمال هذا العمل في web.config.
<أقسام التكوين>
<section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
</configSections>
يمكنك بعد ذلك تكوين القواعد باستخدام قسم RewriterConfig في <configuration>.
في أي جزء من httpmodule تتم معالجة عنوان url؟
يتم تنفيذ معظم العمل في طريقة ModuleRewriter ().
إذا (re.IsMatch(requestedPath))
من الواضح أن هذا يحدد ما إذا كان عنوان url الوارد هو عنوان url الذي نريد إعادة كتابته أم لا.
String sendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Replace(requestedPath, Rules[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
string [] UserHost = app.Request.Url.Host.Split ( new Char [] { '.' } );
string domain2=UserHost [0];
// قم بتعيين عنوان url الهدف المراد إعادة كتابته حسب الحاجة
سلسلة sendToUrl؛
إذا (المجال 2 == "الحب")
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>
</RewriterRule>
يُستخدم (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
قم بالتمرير الآن عندما أصعد، لا يمكن عرض معلمة المعرف ويتم تغييرها إلى اسم مجال المستوى الثاني. ماذا علي أن أفعل في هذا الوقت
؟
<قاعدة كتابة>
<LookFor>http://(w+).kerry .com walk.aspx</LookFor>
<SendTo>/action.aspx</SendTo>
</RewriterRule>
ثم التعامل معها مثل هذا في البرنامج
// احصل على اسم مجال المستوى الثاني
string [] UserHost = app.Request.Url.Host.Split ( new Char [] { '.' } );
سلسلة domain2=UserHost [0];
احصل على أرقام مختلفة بناءً على اسم المجال
int id=getIDfromDomain(domain2);
// احصل على عنوان URL الأساسي لإعادة توجيهه
string sendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Replace(requestedPath, Rules[i].SendTo));
// أضف معلمة معرف
إذا (معرف> 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-_ -