Модуль перезаписи URL-адресов IIS: Url.Content() неправильно разрешает путь CSS/изображения

У меня есть стандартный проект MVC3 со страницей макета и т. д. Теперь мне нужно сделать красивые URL-адреса. Я начал играть с модулем перезаписи URL. Я пытаюсь перевести http://localhost/Photographer/Pabloв http://localhost/category-about.aspx?displayName=Pablo, и вот мое правило перезаписи (очень простое!):

  <system.webServer>
    <rewrite>
      <rules>
        <rule name="about" patternSyntax="Wildcard">
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add matchType="IsDirectory" negate="true" />
            <add input="{REQUEST_URI}" pattern="\.png|\.js|\.css|\.jpg" negate="true" />
          </conditions>
          <match url="photographer/*" />
          <action type="Rewrite" url="category-about.aspx?displayName={R:1}" logRewrittenUrl="true" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>

все условия, которые вы видите, я добавил после того, как погуглил, пытаясь решить проблему - хотя они не помогли.

Я нашел эту страницу: http://www.iis.net/learn/extensions/url-rewrite-module/url-rewriting-for-aspnet-web-forms — в котором говорится, что оператор ~ правильно обрабатывается сервером, когда правила перезаписи применяемый. Но в моем случае этого явно не происходит - см. прикрепленное изображение:

прикрепленное изображение

Каково решение моей проблемы? Как я должен ссылаться на файлы CSS/JS? Я использую MVC3 в IIS 7.5.

ОБНОВЛЕНИЕ: изображение не очень четкое, но оно показывает, что моя страница MasterLayout

<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />

но это решено как

http://localhost/Photographer/Content/Site.css - and it gives 404

вместо

http://localhost/Content/Site.css - which gives 200

когда я запрашиваю этот URL: http://localhost/Photographer/Pablo. Логика работает нормально — мой контроллер получает запрос и отображает страницу — но CSS и изображения отсутствуют (потому что к ним добавлена ​​неправильная корневая папка).


person avs099    schedule 29.08.2013    source источник
comment
IIS 7.5, если это поможет...   -  person avs099    schedule 01.09.2013


Ответы (3)


Попробуйте использовать Request.ApplicationPath. Что-то вроде этого должно работать:

<link href="@(Request.ApplicationPath + "Content/Site.css")" rel="stylesheet" type="text/css" />
person Todd McGregor    schedule 05.09.2013
comment
Кажется, в Url.Content есть ошибка, когда действуют правила перезаписи. Я столкнулся с несколькими другими сообщениями, описывающими именно эту проблему, но без подробной информации о первопричине. На самом деле я обновил свой ответ, поскольку на самом деле не было бы необходимости использовать Url.Content, если вы полагаетесь на Request.ApplicationPath, чтобы добавить корень приложения к своим путям. - person Todd McGregor; 05.09.2013
comment
Обратите внимание, что Request.ApplicationPath не включает завершающую косую черту. Я попытался отредактировать ответ, чтобы обновить его, но он сказал, что мое обновление должно состоять из 6 символов. Мне не хотелось находить 5 других персонажей для изменения. - person BVernon; 13.12.2017

Вы сказали строчку:

<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" />

решается как

"http://localhost/Photographer/Content/Site.css"

, что абсолютно правильно, вот как это будет решено. Где лежит ваш css, правильный ли путь для изображения в css?

person Shashank Chaturvedi    schedule 04.09.2013
comment
почему вы считаете это правильным? это должно быть localhost/Content/Site.css - person avs099; 04.09.2013
comment
Поскольку ~ ведет вас к корневому виртуальному каталогу, теперь вопрос в том, как он отображается в IIS. При запуске приложения какой URL вы получаете? - person Shashank Chaturvedi; 04.09.2013
comment
См. эту ссылку: stackoverflow.com/questions/10482299/ Надеюсь, это поможет. К тому времени я попытаюсь воспроизвести проблему, с которой вы столкнулись. - person Shashank Chaturvedi; 04.09.2013

Вместо этого

<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />

Попробуйте это без тильды (~)

<link href="@Url.Content("/Content/Site.css")" rel="stylesheet" type="text/css" />

Это должно решить вашу желаемую http://localhost/Content/Site.css

person Luke Baughan    schedule 05.09.2013