Перенаправление default.aspx в корневой виртуальный каталог

У меня есть простое приложение ASP.NET 3.5, работающее под IIS7 в виртуальном каталоге. Поэтому URL-адрес моего приложения похож на http://example.com/app. Я хочу 301-перенаправить запрос example.com/app/default.aspx в example.com/app для лучшего SEO. Я должен сделать это перенаправление только с помощью кода, а не с помощью настроек IIS. Я не могу сделать это через код, упомянутый в этой статье:

http://www.4guysfromrolla.com/articles/072810-1.aspx

Код:

if (request.RawUrl.Equals("/default.aspx"))
{
newUrl = string.Format("{0}://{1}{2}",
                 request.Url.Scheme,
                 request.Url.Authority,
                 request.RawUrl.Remove(request.RawUrl.LastIndexOf("/default.aspx", StringComparison.OrdinalIgnoreCase)));

               context.Response.Status = "301 moved permanently";
               context.Response.AddHeader("Location", newUrl);
}

похоже, переходит в бесконечный цикл, когда приложение находится под виртуальным каталогом. свойство request.RawUrl всегда возвращает "/default.aspx" даже после перенаправления 301, вызывающего бесконечный цикл. Как я могу исправить эту проблему?

спасибо,

Асиф

Ответы

Ответ 1

Приведенный выше код будет работать нормально, если у вас нет подкаталога. AFAIK, его ошибка в ASP.NET: Request.RawUrl не должен содержать "/default.aspx", когда URL-адрес не имеет этого расширения. Я проверил ваш код, и он отлично работает без подкаталога, но если default.aspx находится под каталогом, объект Request.RawUrl не сможет избавиться от default.aspx и, следовательно, бесконечного цикла.

Ответ 2

Незначительные изменения для обработки подкаталогов и поддержания переменных URL. Вероятно, лучше функциональность сравнения и замены, но это работает для меня с IIS 7.

if (Request.RawUrl.ToLower().Contains("/default.aspx"))  // use Contains instead of EndsWith to handle url vars
{
    string newUrl = string.Format("{0}://{1}{2}",
                    Request.Url.Scheme,
                    Request.Url.Authority,
                    Request.RawUrl.ToLower().Replace("default.aspx", ""));  // don't remove the trailing slash so url vars are maintained

    Response.Clear();
    Response.Status = "301 Moved Permanently";
    Response.AddHeader("Location", newUrl);
    Response.End();
}

Ответ 3

Я попробовал метод URL Rewrite. То есть этот:

    <rule name="default page" stopProcessing="true">
      <match url="^default\.aspx$" />
      <action type="Redirect" url="{R:0}" redirectType="Permanent" />
    </rule>

но он отправил мой браузер в бесконечный цикл переадресации. Я изменил его до следующего, и он отлично работал:

            <rule name="default page" stopProcessing="true">
                <match url="(.*)default.aspx$" />
                <action type="Redirect" url="{R:1}" redirectType="Permanent" />
            </rule>

Ответ 4

Поскольку вы используете IIS7, попробуйте следующее:

<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="default page" stopProcessing="true">
          <match url="^default\.aspx$" />
          <action type="Redirect" url="{R:0}" redirectType="Permanent" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

Это просто быстрый пример, вы можете изменить его в соответствии с вашими потребностями. Надеюсь, это поможет!

Ответ 5

Это сработало для меня. http://www.w3schools.com/asp/met_redirect.asp

Используя приведенную выше ссылку, я написал следующие строки и выполнил ее без каких-либо проблем. Обратите внимание, что в конце нет точки с запятой. Моя страница default.aspx содержит только три строки.

<%
    Response.Redirect("~/portal")
%>

Возможная причина; обычно язык упоминается в верхней части страниц .aspx или в файле web.config. Если язык не указан, IIS использует VB.NET для компиляции страниц, и мы знаем, что VB.NET не использует точки с запятой для прекращения операторов.

Ответ 6

Используйте этот код на странице default.aspx

<script language="javascript">
var url=location.href;
if (url.toLowerCase()=="http://www.doamin.com/default.aspx" || url.toLowerCase()=="http://www.doamin.com/#") {
window.location= "http://www.doamin.com";
}

</script>