Как я могу перенаправить и изменить URL-адреса без расширений через ASP.NET?

StackOverflow https://stackoverflow.com/questions/121813

Вопрос

Мы изменили структуру сайта, в котором есть несколько бизнес-подразделений.Теперь я хочу перенаправить (301) на новую страницу.

ИЕ:
был 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://localhost:1234/пример/abc перенаправляется правильно, но (где 1234 — порт сервера отладки)
http://localhost/пример/abc не перенаправляет, выдает 404.

Есть идеи?


Дополнительная информация:Если я пойду в http://localhost/example/abc/default.aspx тогда он перенаправляется правильно.

Это было полезно?

Решение

Что ж, если порт указывает, что вы используете встроенный веб-сервер (тот, который поставляется с VS), это, вероятно, работает, потому что это всегда маршрутизирует запросы через платформу ASP.NET.

Запросы, заканчивающиеся на /abc, не будут автоматически маршрутизироваться через платформу ASP.NET, поскольку IIS может «не знать», что вы этого хотите.Вам необходимо проверить настройки IIS, чтобы убедиться, что такие запросы направляются в aspnet_isapi.dll.


РЕДАКТИРОВАТЬ: Для этого вам необходимо добавить сопоставление подстановочных знаков:

  1. В диспетчере IIS разверните локальный компьютер, разверните папку «Веб-сайты», щелкните правой кнопкой мыши нужный веб-сайт или виртуальный каталог и выберите «Свойства».
  2. Нажмите соответствующую вкладку:Домашний каталог, виртуальный каталог или каталог.
  3. В области «Настройки приложения» нажмите «Конфигурация», а затем перейдите на вкладку «Сопоставления».
  4. Чтобы установить карту приложения с подстановочными знаками, выполните следующие действия:
    • На вкладке «Сопоставления» нажмите «Добавить» или «Вставить».
    • Введите путь к DLL в текстовом поле «Исполняемый файл» или нажмите «Обзор», чтобы перейти к нему (например, DLL ASP.NET 2.0 находится по адресу c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll на моем компьютере). машина)
    • Для расширения используйте ".*", конечно, без кавычек.
    • Выберите, какие команды вы хотите искать (GET, HEAD, POST, DEBUG являются обычными для ASP.NET, вы решаете)
    • Убедитесь, что выбран «Механизм сценариев» или «Механизм приложений».
    • Снимите флажок «Проверить, что файл существует».
    • Нажмите «ОК».

Возможно, я ошибаюсь, но если это так, то, надеюсь, кто-нибудь меня поправит.:)

Другие советы

Вам следует использовать перенаправление подстановочных знаков IIS, вам понадобится что-то вроде этого;

 *; www.example.com/*; www.example.com/default.aspx?article=$0

Есть разумная ссылка на Майкрософт

Если вы используете Apache, я думаю, вам нужно изменить файл htaccess.

Вы сейчас тестируете сайт на веб-сервере Visual Studio?Обычно при этом сайт запускается на «localhost:nnnnn», где «nnnnn» — это номер порта (как указано выше, 1234), он не позволяет ему работать без него.

Если на соответствующем компьютере установлен IIS, опубликуйте на нем свой проект, и вы сможете убедиться, что он работает без «nnnnn», поскольку в вашем коде нет ничего, что могло бы привести к его неработоспособности. Сделай так.

Удостоверились ли вы, что файлы web.config одинаковы для каждого веб-сайта (при условии, что: 1234 отличается от: 80)

Кроме того, вы пробовали localhost:80?

Возможно, вы захотите взглянуть на Маршрутизация.

Видеть:

Твой http://localhost/пример/abc не вызывает Global.asax, как вы ожидаете.Обычно http://локальный хост работает на порту 80 (:80).Если вы хотите запустить свой сайт через порт 80, вам нужно будет развернуть свой сайт в IIS, чтобы он работал здесь.

Вам необходимо настроить сопоставление обработчиков в IIS для пересылки всех неизвестных расширений в asp.net.Первый работает, потому что Cassini обрабатывает все запросы, второй не работает, потому что IIS ищет этот каталог, а он не существует, вместо того, чтобы инфраструктура .net запускала имеющийся у вас код.

Вот информация о том, как это сделать Переписывание URL-адресов в asp.net.

Если возможно, я бы предложил использовать новый Маршрутизация запросов приложений или UrlRewrite.net

IIS по умолчанию не передает все запросы на обработку ASP.NET.Только некоторые расширения ресурсов, в том числе «aspx», будут переданы для обработки asp.net.Что происходит, когда вы запрашиваете http://localhost/пример/abc заключается в том, что IIS пытается найти каталог, чтобы узнать, есть ли у вас файл по умолчанию (т.default.aspx, index.html) для загрузки из этого каталога.Поскольку он не может найти каталог с нежелательным тегом «abc», он никогда не находит файл default.aspx для загрузки.

Когда вы пытаетесь загрузить http://localhost/example/abc/default.aspx, IIS видит расширение «aspx» и немедленно передает его для обработки среде выполнения ASP.NET.Причина того, что http://localhost/пример/abc запрос не загружается, заключается в том, что он никогда не передается в ASP.NET, поэтому, конечно, global.asax его никогда не видит.

Сайт, размещенный на Cassini, обрабатывает все запросы, поэтому этот вызов обрабатывается ASP.NET и файлом global.asax.

Я согласен с Дарреном Коппом, который предположил, что вам необходимо настроить сопоставление обработчиков в IIS для пересылки неизвестных расширений в ASP.NET.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top