Мы переработали структуру веб-сайта, на котором есть несколько бизнес-подразделений. Теперь я хочу перенаправить (301) на новую страницу.
IE:
было www.example.com/abc
теперь www.example.com/default.aspx?article=abc
Я попытался использовать Global.asax для этого, и он работает правильно, когда я отлаживаю его.
if (Request.RawUrl.Contains("abc"))
{
Response.RedirectLocation = "/default.aspx?article=abc";
Response.StatusCode = 301;
Response.StatusDescription = "Moved";
Response.End();
}
Таким образом, http: // локальный: 1234 / пример / abc перенаправляет правильно, но (где 1234 - порт для сервера отладки)
http: // локальный / пример / abc не перенаправляет, дает мне 404.
Есть идеи?
Дополнительная информация: Если я перейду к http: //localhost/example/abc/default.aspx, он правильно перенаправит.





Вы убедились, что файлы web.config одинаковы для каждого веб-сайта (при условии, что 1234 отличается от 80)
Кроме того, вы пробовали localhost: 80?
Вы сейчас тестируете сайт на веб-сервере Visual Studio? Обычно это запускает сайт на «localhost: nnnnn», где «nnnnn» - это номер порта (как указано выше, 1234), он не запускает его без него.
Если на вашем компьютере установлен IIS, опубликуйте на нем свой проект, и вы сможете убедиться, что он работает без "nnnnn", поскольку в вашем коде нет ничего, что могло бы заставить его не работать. Сделай так.
Возможно, вы хотите взглянуть на Маршрутизация.
Видеть:
Что ж, если порт указывает, что вы используете встроенный веб-сервер (тот, который поставляется с VS), это, вероятно, работает, потому что всегда направляет запросы через платформу ASP.NET.
Запросы, заканчивающиеся на / abc, не будут автоматически маршрутизироваться через платформу ASP.NET, потому что IIS может «не знать», что вы хотите. Вам необходимо проверить настройки IIS, чтобы убедиться, что такие запросы направляются в aspnet_isapi.dll.
Обновлено: Для этого вам нужно добавить сопоставление с подстановочными знаками:
Возможно, я не согласен с этим, но, надеюсь, кто-нибудь поправит меня. :)
Ваш http: // локальный / пример / abc не вызывает Global.asax, как вы ожидаете. Обычно http: // localhost работает на порту 80 (: 80). Если вы хотите запустить свой сайт на 80-м порту, вам нужно будет развернуть свой сайт в IIS для запуска здесь.
Вам необходимо настроить отображение обработчика в IIS для пересылки всех неизвестных расширений на asp.net. Первый работает, потому что cassini обрабатывает все запросы, второй не работает, потому что IIS ищет этот каталог, а он не существует, вместо платформы .net, выполняющей код, который у вас есть.
Вот информация о том, как сделать Перезапись URL в asp.net.
Если возможно, я бы предложил использовать новый Маршрутизация запросов приложений или UrlRewrite.net
Вы должны использовать перенаправление подстановочного знака IIS, вам понадобится что-то вроде этого;
*; www.example.com/*; www.example.com/default.aspx?article=$0
Есть разумная ссылка на Microsoft
Если вы используете Apache, я думаю, вам нужно изменить файл htaccess.
Это может быть лучший способ обрабатывать перенаправления вместо отображения всего через aspnet_isapi, если все, что вам нужно делать, это перенаправления. Существуют также плагины для IIS, которые работают как mod_rewrite в Apache, у меня нет веб-сайтов в голове, но они есть.
IIS по умолчанию не передает все запросы в ASP.NET для обработки. Только некоторые расширения ресурсов, среди них aspx, будут переданы asp.net для обработки. Когда вы запрашиваете http: // локальный / пример / abc, IIS пытается найти каталог, чтобы узнать, есть ли у вас файл по умолчанию (например, default.aspx, index.html) для загрузки из этого каталога. Поскольку он не может найти каталог с мусорным тегом «abc» в нем, он никогда не находит файл default.aspx для загрузки.
Когда вы пытаетесь загрузить http: //localhost/example/abc/default.aspx, IIS видит расширение aspx и немедленно передает его среде выполнения ASP.NET для обработки. Причина, по которой запрос http: // локальный / пример / abc не загружается, заключается в том, что он никогда не передается в ASP.NET, поэтому, конечно, global.asax никогда его не видит.
Сайт, размещенный на Cassini, обрабатывает все запросы, поэтому этот вызов обрабатывается ASP.NET и файлом global.asax.
Я согласен с Дарреном Коппом, который предположил, что вам необходимо настроить сопоставление обработчиков в IIS для пересылки неизвестных расширений в ASP.NET.
Как мне это правильно установить? Я смотрю на диалоговое окно «Добавить / изменить сопоставление расширений приложения».