سؤال

أنا أستخدم IIS 7.5 على نظام التشغيل Windows 7 RC. يمكنني استخدام وحدة التحكم في URL IIS لإعادة كتابة عناوين URL.

يبدو أن كل شيء يعمل بشكل جيد، حتى أقوم بإعادة النشر بالنقر فوق زر. ثم إلحاق بعلامات الاستعلام عن عنوان URL الذي أعيد كتابته، مثل هذا:

إعادة كتابة عنوان URL، كما يظهر في المتصفح:http: // localhost / en / product / 1239 / غاري + فيشر + hkek + جبل + دراجة

دون إعادة كتابة عنوان URL الخاص بك هو:

http: //localhost/product.aspx؟ lang = en & id = 1239 & title = غاري + فيشر + hkkek + جبل + دراجة

عند النقر فوق زر لأداء إعادة النشر، يتغير عنوان URL إلى هذا:

http: // localhost / en / product / 1239 / غاري + فيشر + hkkek + جبل + دراجة؟ Lang = en & id = 1239 & title = غاري + فيشر + hkkek + جبل + دراجة

وعندما يتم إعادة كتابة عنوان URL، تضاعف جميع مخاطر الاستعلام - لذلك عندما أريد الحصول على اللغة الحالية عن طريق القيام بذلك:

Request.QueryString["lang"]

القيمة التي أعيدها هي "EN، EN".

هل أي شخص آخر لديه هذه المشاكل؟

تحديث: إعادة كتابة القواعد من Web.config

<rule name="RedirectProductPageUrls" stopProcessing="true">
    <match url="^product\.aspx$" />
    <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_METHOD}" negate="true" pattern="^POST$" />
        <add input="{QUERY_STRING}" pattern="^lang=([^=&amp;]+)&amp;id=([^=&amp;]+)&amp;title=([^=&amp;]+)$" />
    </conditions>
    <action type="Redirect" url="{C:1}/products/{C:2}/{C:3}" appendQueryString="false" redirectType="Permanent" />
</rule>
<rule name="RewriteProductPageUrls" stopProcessing="true">
    <match url="^([^/]+)/product/([^/]+)/([^/]+)/?$" />
    <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="product.aspx?lang={R:1}&amp;id={R:2}&amp;title={R:3}" />
</rule>
هل كانت مفيدة؟

المحلول

أضف AppendqueryString = "False" السمة إلى عنصر الإجراء في قاعدة إعادة الكتابة أيضا.

أتمنى أن يساعدك هذا.

نصائح أخرى

كنت قادرا على حل المشكلة عن طريق إضافة

Form.Action = Request.RawUrl;

إلى حدث page_load. كنت قادرا على مغادرة التوصيلات = "True" وحتى الآن تعمل بشكل صحيح.

هذه ميزة أمان من وحدة إعادة كتابة IIS.

أنا شخصيا أفضل إعادة كتابة ISAPI لأنها أفضل بكثير، وأبسط أن تكتب القواعد، ولديها المزيد من الميزات.

لقد وجدت أيضا تحت حمولة معتدلة إلى عالية (أكثر من 100 اتصال بموقع على شبكة الإنترنت) أن وحدة نمطية IIS تعيد كتابة وحدة تجمع التطبيقات لتحطمها وتفرخها وعملية جديدة.

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