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

Мы изменили структуру сайта до нескольких бизнес-единиц. Теперь я хочу перенаправить (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://localhost:1234/example/abc перенаправляет правильно, но (где 1234 - порт для сервера отладки)
http://localhost/example/abc не перенаправляет, это дает мне 404.

Есть идеи?


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

Ответы [ 8 ]

6 голосов
/ 23 сентября 2008

Хорошо, если порт указывает, что вы используете встроенный веб-сервер (тот, который поставляется с 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. длл на моей машине)
    • Для расширения используйте «. *» Без кавычек, конечно
    • Выберите, какие глаголы вы хотите найти (GET, HEAD, POST, DEBUG являются обычными для ASP.NET, вы решаете)
    • Убедитесь, что выбран «Механизм сценариев» или «Механизм приложений»
    • Снимите флажок «Проверить, существует ли файл»
    • Нажмите окей.

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

2 голосов
/ 23 сентября 2008

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

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

Есть разумная ссылка на Microsoft

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

1 голос
/ 23 сентября 2008

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

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

0 голосов
/ 23 сентября 2008

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

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

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

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

0 голосов
/ 23 сентября 2008

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

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

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

0 голосов
/ 23 сентября 2008

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

0 голосов
/ 23 сентября 2008
0 голосов
/ 23 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...