Проверьте, не является ли первый сегмент URL файлом или каталогом - PullRequest
1 голос
/ 12 марта 2012

У меня есть правило перезаписи в моем файле web.config, например:

  <rule name="Public page" stopProcessing="true">
      <match url="^([^/]+)/([^/]+)/?$" />
      <conditions>
          <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
          <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          <add input="{URL}" pattern="\.(.*)$" negate="true" />
      </conditions>
      <action type="Rewrite" url="public/place/{R:2}.aspx?cname={R:1}" />
    </rule>

Что он делает, это позволяет клиенту вводить динамическое имя места и затем страницу, которую он хочет видеть.Например, у меня есть страница, которая отображает новости для компаний.Я хочу видеть новости для компании под названием "Павильон", поэтому я набираю:

http://localhost/pavilion/news/ 

, и перезапись URL приводит меня к

http://localhost/public/news.aspx?cname=pavilion

Это работает.Но я получаю много ошибок о том, что страница не найдена для такого случая: атрибут src изображения, который указывает на какое-то несуществующее имя с другой страницы.Например, на странице продуктов (http://localhost/products/showproducts.aspx) у меня есть:

<img src='undefined'/>

, когда я отлаживаю, я вижу, что оно запускает правило, думая, что products равно {R: 2} и undefined равен {R: 1}, поэтому он пытается загрузить http://localhost/products/undefined/, и я получаю сообщение об ошибке: The file '/public/undefined.aspx' does not exist.

Я бы хотел, чтобы правило не срабатывало, если первый сегмент URL является каталогомили файл. Кто-нибудь есть идея, как я могу сделать такую ​​проверку?

1 Ответ

0 голосов
/ 15 марта 2012

Ответ заключается в использовании обратной ссылки в строке ввода условия.

 <rule name="Public page" stopProcessing="true">
                <match url="^([^/]+)/([^/]+)/?$" />
                <conditions>
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    <add input="{URL}" pattern="\.(.*)$" negate="true" />
                    <add input="{DOCUMENT_ROOT}\{R:1}" matchType="IsFile" negate="true" />
                    <add input="{DOCUMENT_ROOT}\{R:1}" matchType="IsDirectory" negate="true" />
                </conditions>
                <action type="Rewrite" url="public/place/{R:2}.aspx?cname={R:1}" />
            </rule> 

Благодарю Лев за ответ

...