почему отрицание = "правда" в вашем правиле?

росмотре моего сайта из локального IIS адрес выглядит в адресной строке браузера какHTTP: // локальный: 8800 / гб / default.aspx

я пытался извлечь код страны из адресной строки браузера и вставил в href всех гиперссылок с правилом перезаписи IIS.

это мое исходящее правило, которое я использовал в своем файле web.config.

<outboundRules>
    <rule name="add outbound rule" preCondition="Ishtml" enabled="true" stopProcessing="true">
        <match filterByTags="A" pattern="(\/[a-z]+\/)(.*)" negate="true" />
        <action type="Rewrite" value="{R:1}{R:2}" />
    </rule>
    <preConditions>
        <preCondition name="Ishtml">
            <add input="{RESPONSE_CONTENT_TYPE}" pattern="text/html" />
        </preCondition>
    </preConditions>
</outboundRules>

когда я тестирую шаблон из окна модуля iis rewrite, вывод выглядит так, как показано ниже. вот снимок экрана.

поэтому во время теста я увидел{R: 1} - это / gb /, а {R: 2} - это default.aspx, поэтому, когда это правило выполнить его изменитьвсе гиперссылки href на странице default.aspx и всегиперссылка href становится сейчасHTTP: // локальный: 8800 / гб / default.aspx

в основном мне нужно ввестикод страны из адресной строки браузера в целомгиперссылка href текущей страницы.

Я думаю, что я немного ближе к тому, чего я пытаюсь достичь, но теперь мне не нужна помощь в решении этой проблемы. я думаю, что эта область должна быть немного изменена<action type="Rewrite" value="{R:1}{R:2}" />

поэтому, пожалуйста, помогите и направьте меня в правильном направлении.

Ответы на вопрос(1)

так как вы вернетесь к частям совпадения правила с{R:1} а также{R:2} но это никогда не будет совпадать, так как вы отрицали этоnegate="true", То есть если оно не соответствует этому регулярному выражению{R:1} а также{R:2} будет (скорее всего) также недоступен.

Что вам нужно сделать, это добавить дополнительное условие, которое соответствует строке запроса с тем же регулярным выражением. Это условие будет гарантировать, что текущий URL будет соответствовать этому регулярному выражению, а затем вы можете вернуть ссылки на него с помощью{C:1} а также{C:2}и т.д ... (с письмомC вместоR). Хитрость заключается в использовании комбинации{C:1} а также{R:0}. {C:1} даст вам код языка с текущего URL и{R:0} даст вам исходный URL из<a href>.

Так что в итоге вы получите:

<outboundRules>
    <rule name="add outbound rule" preCondition="Ishtml" enabled="true" stopProcessing="true">
        <match filterByTags="A" pattern="^\/(?![a-z]{2}\/).*" />
        <action type="Rewrite" value="{C:1}{R:0}" />
        <conditions>
            <add input="{HTTP_X_ORIGINAL_URL}" pattern="^(\/[a-z]{2})\/(.*)" />
        </conditions>
    </rule>
    <preConditions>
        <preCondition name="Ishtml">
            <add input="{RESPONSE_CONTENT_TYPE}" pattern="text/html" />
        </preCondition>
    </preConditions>
</outboundRules>

Кстати, ваше регулярное выражение для тега A очень слабое. Будет соответствовать/gb/default.aspx но это также будет соответствовать/foo/bar/default.aspx или же/foo/bar/gb/default.aspx и при этом не переписывать эти ссылки. Я заменил его на более строгую версию, соответствующую только/<two letters>/<anything>.

Обратите внимание, что я взял\/ после совпадения первых двух букв из первой группы в условии, так как нам не нужна эта косая черта в обратной ссылке{C:1} как это уже в{R:0}.

РЕДАКТИРОВАТЬ: Я сделал предположение, что{R:0} будет по-прежнему доступен в качестве обратной ссылки, даже если регулярное выражение не будет совпадать. Это не похоже на случай. Итак, я вынулnegate="true" и исправил регулярное выражение для соответствия любому URL, кроме тех, которые начинаются с/<two-letters/ (чтобы не переписывать уже правильные URL).

Другая ошибка должна была соответствовать{REQUEST_URI} при условии, что это был оригинальный URL, как видно в браузере с языковым кодом в нем. Но, очевидно, это не так, как вы (входящие), возможно, переписать этот URL и вынуть код языка. Так что я заменил это{HTTP_X_ORIGINAL_URL}, Эта переменная устанавливается модулем перезаписи URL и сохраняет исходный URL.

Наконец<add ..> в<condition>...</condition> не хватало закрытия/, Я надеюсь, что теперь это работает для вас.

 Thomas30 нояб. 2017 г., 21:08
Спасибо за вашу помощь. Я проверю и дам вам знать, что ваше правило работает для меня или нет. У меня есть еще один пост по правилу перезаписи. Можете ли вы проверить этот пост и поделиться своими мыслямиstackoverflow.com/questions/47581732/...
 Thomas01 дек. 2017 г., 10:40
почему отрицание = "правда" в вашем правиле?
 Thomas01 дек. 2017 г., 10:28
Я проверяю это не сработало.

Ваш ответ на вопрос