Перенаправление 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>