Перенаправление default.aspx в корневой виртуальный каталог - PullRequest
13 голосов
/ 31 августа 2010

У меня есть простое приложение 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, вызывающего бесконечный цикл. Как я могу исправить эту проблему?

спасибо,

Асиф

Ответы [ 6 ]

2 голосов
/ 01 сентября 2010

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

1 голос
/ 09 июля 2011

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

    <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>
1 голос
/ 01 апреля 2011

Небольшие модификации для работы с подкаталогами и поддержки переменных 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();
}
0 голосов
/ 05 июля 2013

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

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

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

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

0 голосов
/ 02 февраля 2012

Используйте этот код на странице 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>
0 голосов
/ 01 сентября 2010

Поскольку вы используете 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>

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

...