كيفية إعادة توجيه المجلد الفرعي للاستعلام في Mod Rewrite لـ IIS 7.0؟

StackOverflow https://stackoverflow.com/questions/632360

  •  08-07-2019
  •  | 
  •  

سؤال

أنا أستخدم Mod Rewrite لـ IIS 7.0 من iis.net وأريد إعادة توجيه الطلبات:

لقد قمت بإنشاء قاعدتين:

<rule name="ID">
   <match url="/users/([0-9])" />
   <action type="Rewrite" url="/User.aspx?id={R:1}" />
</rule>
<rule name="Name">
   <match url="/users/([a-z])" ignoreCase="true" />
   <action type="Rewrite" url="/User.aspx?name={R:1}" />
</rule>

يقوم بتمرير اختبار إلى مربع حوار اختبار iis mmc، لكنه لا يقوم بتصحيح الأخطاء (يشبه عنوان URL http://localhost:9080/example.com/users/1 أو …/المستخدمين/فو) ولا يوجد على IIS الحقيقي!

مالخطأ الذي فعلته؟

هل كانت مفيدة؟

المحلول

المشكلة الواضحة هي أن regexes الحالية الخاصة بك تتطابق فقط مع حرف واحد في اسم المستخدم أو رقم واحد.ستحتاج إلى إضافة محدد كمية زائد داخل الأقواس لمطابقة عدة أحرف أو أرقام.يرى هذه الصفحة لمزيد من المعلومات حول محددات الكمية regex.لاحظ أنك لن تقوم بمطابقة عناوين URL العادية مثل "/users/" (بدون معرف أو اسم).تأكد من أن هذا هو ما قصدته.

المشكلة الأخرى التي تواجهها هي أن IIS يقوم بتقييم قواعد إعادة الكتابة بدءًا من الحرف الأول بعد الشرطة المائلة الأولية.لذلك القاعدة الخاصة بك لتتناسب /users/([0-9]) لن يتطابق مع أي شيء لأنه عندما يحدث تقييم التعبير العادي، يبدو عنوان URL كما هو users/foo لا /users/foo.الحل هو الاستخدام ^ (وهو حرف regex الذي يعني "بداية السلسلة") في بداية النمط بدلاً من الشرطة المائلة.مثله:

<rule name="ID">
    <match url="^users/([0-9]+)" />
    <action type="Rewrite" url="/User.aspx?id={R:1}" />
</rule>
<rule name="Name">
    <match url="^users/([a-z]+)" ignoreCase="true" />
    <action type="Rewrite" url="/Users.aspx?name={R:1}" />
</rule>

لاحظ أنك تختار Users.aspx لأحد عناوين URL هذه و User.aspx (لا جمع) للآخر.تأكد من أن هذا هو ما قصدته.

راجع للشغل، الطريقة التي اكتشفت بها هذه الأشياء كانت باستخدام فشل طلب IIS في التتبع لاستكشاف أخطاء قواعد إعادة الكتابة وإصلاحها.هذا جعل تشخيص هذا الأمر سهلاً حقًا.لقد تمكنت من تقديم طلب اختبار والبحث في التتبع للعثور على المكان الذي يتم فيه تقييم كل قاعدة إعادة كتابة (موجود في قسم من التتبع يسمى "PATTERN_MATCH".بالنسبة إلى PATTERN_MATCH المعينة لإحدى قواعدك، رأيت هذا:

-نمط المباراة
النمط /المستخدمون/([0-9]+؟)
مستخدمو InputURL/1
نفي الباطل
متطابقة كاذبة

لاحظ عدم وجود شرطة مائلة في البداية.

نصائح أخرى

يجب عليك استخدام <match url="/users/([0-9]+)" /> و <match url="/users/([a-z]+)" ignoreCase="true" />, ، على التوالي، لمطابقة المعرف/المستخدم الكامل وليس فقط الحرف/الرقم الأول.لكنني لا أعرف سبب فشل التعبير العادي الخاص بك في رقم واحد، لذلك يجب أن تكون هناك مشكلة أخرى أيضًا.

أما بالنسبة لسؤالك الثاني، فلست متأكدًا من أنني أفهمه تمامًا.كيف يمكنك معرفة الفرق بين اسم المجلد واسم المستخدم؟هل سيحتوي المجلد دائمًا على شرطة مائلة زائدة؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top