Перезапись IIS с генерацией слагов, имеющих проблемы с амперсандами

Я пытаюсь изменить URL-адрес, например

example.com/company/company-1

to

example.com?slug=company-1

Я переписываю, используя следующий шаблон

<rule name="company">
    <match url="^company/([_0-9a-z-()]+)" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="company.php?slug={R:1}" />
</rule>

в моем файле web.config.

Это работает до тех пор, пока название компании не содержит амперсанд, например. ветчина с яйцами

Название компании закодировано в URL-адресе, поэтому на самом деле оно выглядит как ham-%26-eggs.

который мой шаблон записывает в example.com?slug=ham-

Я попытался добавить амперсанд к шаблону

e.g.

<match url="^company/([_0-9a-z-()&amp;]+)" />

и

<match url="^company/([_0-9a-z-()&]+)" />

Оба из которых приводят к ошибке сервера.

Что я могу сделать, не меняя состав входящего URL-адреса?

заранее спасибо

Ник


person NaNuk    schedule 18.02.2015    source источник
comment
Как насчет того, чтобы сделать что-то проще, например. ^компания/([^/]+)   -  person TonyCool    schedule 18.02.2015
comment
да, я только что попробовал ваше предложение и ранее просто сопоставлял что-либо после ^company/, но они оба выдают ошибку сервера 500   -  person NaNuk    schedule 18.02.2015


Ответы (1)


Вам нужно будет использовать переменную UNENCODED_URL, в которой хранится исходный URL-адрес (не незакодированный, который разбивает & на новый параметр).

Вы можете запускать сопоставления с этими условиями и использовать синтаксис {C:1} вместо синтаксиса {R:1} (который соответствует шаблону закодированного правила), если вам нужно.

См.: http://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference

person Sean    schedule 22.02.2016