Использование пользовательских доменов с помощью IIS Express

Традиционно я использую пользовательские домены с моим сервером разработки localhost. Что-то вроде:

dev.example.com
dev.api.example.com

Это обеспечило мне большую гибкость при работе с внешним API, таким как Facebook. В прошлом это отлично работало со встроенным в Visual Studio Development Server, потому что все, что мне нужно было сделать, это добавить CNAME в эти записи DNS, указывающие на 127.0.0.1.

Однако мне не удалось заставить это работать с IIS Express. Кажется, что все, что я пробовал, потерпело неудачу. Я даже добавил правильную конфигурацию XML в файл applicationHost.config для IIS Express, но, похоже, он не признает записи действительными, как истинная установка IIS.

<binding protocol="http" bindingInformation="*:1288:dev.example.com" />

Всякий раз, когда я вхожу в эту строку и пытаюсь запросить http://dev.example.com:1288, я получаю следующее сообщение:

Неверный запрос - неверное имя хоста

Кто-нибудь знает, не хватает ли я чего-то очевидного? Или действительно ли команде IIS Express не хватало предвидения, чтобы увидеть этот тип использования?

Ответ 1

Это то, что сработало для меня (обновлено для VS 2013, см. историю изменений в 2010 году для VS 2015): fooobar.com/questions/26451/...):

  • Щелкните правой кнопкой мыши проект веб-приложения ▶ PropertiesWeb, затем настройте раздел Servers следующим образом:
    • Выберите IIS Express ▼ из раскрывающегося списка
    • Project Url: http://localhost
    • Заменить корневой URL-адрес приложения: http://dev.example.com
    • Нажмите Create Virtual Directory (если вы здесь получите ошибку, вам может потребоваться отключить IIS 5/6/7/8, измените IIS Default Site на любой, кроме порта :80, убедитесь, что Skype не использует порт 80 и т.д.)
  • Необязательно: установите Start URL на http://dev.example.com
  • Откройте %USERPROFILE%\My Documents\IISExpress\config\applicationhost.config (Windows XP, Vista и 7) и отредактируйте определение сайта в блоке конфигурации <sites> для следующих строк:

    <site name="DevExample" id="997005936">
        <application path="/" applicationPool="Clr2IntegratedAppPool">
            <virtualDirectory
                path="/"
                physicalPath="C:\path\to\application\root" />
        </application>
        <bindings>
            <binding
                protocol="http"
                bindingInformation=":80:dev.example.com" />
        </bindings>
        <applicationDefaults applicationPool="Clr2IntegratedAppPool" />
    </site>
    
  • Если вы используете MVC: убедитесь, что для параметра applicationPool задано одно из параметров "Интегрировано" (например, "Clr2IntegratedAppPool" ).

  • Откройте hosts файл и добавьте строку 127.0.0.1 dev.example.com.
  • ► Start ваше приложение!

Некоторые замечательные советы от комментариев:

  • Возможно, вам потребуется запустить Visual Studio в качестве администратора.
  • Если вы хотите, чтобы другие разработчики видели ваш запуск IIS netsh http add urlacl url=http://dev.example.com:80/ user=everyone
  • Если вы хотите, чтобы сайт разрешался для всех хостов, установите bindingInformation="*:80:". Используйте любой порт, который вам нужен, 80 просто удобно.

Ответ 2

Для Visual Studio 2015 применимы шаги, описанные выше, но файл applicationhost.config находится в новом месте. В вашей папке "Solution" следуйте по пути, это сбивает с толку, если вы обновились, и на вашей машине будет две версии applicationhost.config.

\.vs\config

В этой папке вы увидите ваш файл applicationhost.config

В качестве альтернативы вы можете просто найти в папке вашего решения файл .config и найти его таким образом.

Я лично использовал следующую конфигурацию:

enter image description here

Со следующим в моем файле hosts:

127.0.0.1       jam.net
127.0.0.1       www.jam.net

И следующее в моем файле applicationhost.config:

<site name="JBN.Site" id="2">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="C:\Dev\Jam\shoppingcart\src\Web\JBN.Site" />
    </application>
    <bindings>
        <binding protocol="http" bindingInformation="*:49707:" />
            <binding protocol="http" bindingInformation="*:49707:localhost" /> 
    </bindings>
</site>

Не забудьте запустить свой экземпляр Visual Studio 2015 в качестве администратора! Если вы не хотите делать это каждый раз, я рекомендую это:

Как запустить Visual Studio от имени администратора по умолчанию

Надеюсь, это кому-нибудь поможет, у меня были проблемы при обновлении до visual studio 2015, и я понял, что ни одна из моих конфигураций не была перенесена.

Ответ 3

При использовании Visual Studio 2012 с IIS Express изменение существующее связывание не работает постоянно. (Это может сработать до тех пор, пока вы не закроете VS, но после этого все будет запутано.)

Ключ поддерживает существующую привязку localhost и добавляет новое связывание после него.

Если вы не работаете как администратор, вам также нужно будет запустить netsh add urlacl (чтобы дать себе разрешение на запуск не- localhost как стандартный пользователь).

Если вы хотите разрешить любое имя хоста, полный процесс выглядит следующим образом:

  • Создайте свое веб-приложение и узнайте, какой порт он использует (см. свойства проекта, вкладку "Веб", "URL проекта" ).
  • В приглашении администратора запустите следующие команды (заменив номер порта номером порта, который вы указали в # 1):

    netsh http add urlacl url="http://*:portnumber/" user=everyone
    netsh http add urlacl url="http://localhost:portnumber/" user=everyone
    

Вы также можете использовать свое имя пользователя (DOMAIN\USER) вместо всех для лучшей безопасности.

  1. Откройте applicationhost.config(обычно в разделе Мои документы \IIS Express\config) и найдите элемент с номером вашего порта.
  2. Добавьте еще одно связывание с требуемым именем хоста (в данном случае, *). Например:

    <site name="MvcApplication1" id="2">
        <application path="/" applicationPool="Clr4IntegratedAppPool">
            <virtualDirectory path="/" physicalPath="C:\sites\MvcApplication1" />
        </application>
        <bindings>
            <binding protocol="http" bindingInformation="*:12853:localhost" />
            <binding protocol="http" bindingInformation="*:12853:*" />
        </bindings>
    </site>
    

Обратите внимание, что если вы хотите открыть все имена хостов (*), вам понадобятся две команды netsh (одна для * и одна для localhost). Если вы хотите только открыть конкретное имя хоста, вам не нужна только вторая команда netsh (localhost); достаточно одного с вашим конкретным именем хоста.

Ответ 4

Недопустимое имя хоста указывает, что фактический сайт, настроенный в конфигурационном файле IIS Express (скорее всего) не работает. У IIS Express нет такой модели процесса, как IIS.


Для запуска вашего сайта его необходимо запустить явно (либо путем открытия и доступа к вебматрице, либо из командной строки, вызывающей iisexpress.exe(из него установочной директории) с параметром /site.


В общем случае шаги, позволяющие использовать полные имена DNS для локального доступа, Позвольте использовать ваш пример DNS-имени dev.example.com

  • изменить файл% windows%\system32\drivers\etc\hosts для сопоставления dev.example.com с 127.0.0.1 (требуется привилегия администратора). Если вы управляете DNS-сервером (например, в случае Nick), запись DNS достаточно, так как этот шаг не требуется.
  • Если вы подключаетесь к интернету через прокси-сервер, убедитесь, что dev.example.com не будет forwared для прокси-сервера (вы должны включить в список исключений в своем браузере (для IE это будут Tools/Internet Options/Connections/Lan Settings, затем перейдите к Proxy Server/Advanced и поместите файл dev.example.com в список exeption.
  • Настройте привязку IIS Express для вашего сайта (например: Site1), чтобы включить dev.example.com. Для использования привязки потребуется административная привилегия. В качестве альтернативы, однократное резервирование URL-адресов может быть выполнено с помощью http.sys, используя

    netsh http add urlacl url=http://dev.example.com:<port>/ user=<user_name>

  • запустите iisexpress /site:Site1 или откройте Site1 в WebMatrix

Ответ 5

На моем WebMatrix IIS Express установка смены с "*:80:localhost" на "*:80:custom.hostname" не работала ( "Bad Hostname", даже при правильных и т.д. \hosts сопоставлениях), но "*:80:" действительно работало - и ни с одним из них дополнительные шаги, требуемые другими ответами здесь. Обратите внимание, что "*:80:*" не будет этого делать; оставьте вторую звездочку.

Ответ 6

Я пытался интегрировать публичный IP-адрес в свой рабочий процесс, и эти ответы не помогли (мне нравится использовать IDE в качестве среды IDE). Но приведенное выше привело меня к решению (примерно через 2 часа ударить головой о стену, чтобы это интегрировалось с Visual Studio 2012/Windows 8), вот что в итоге работало для меня.

applicationhost.config, сгенерированный VisualStudio под C:\Users\usr\Documents\IISExpress\config

    <site name="MySite" id="1">
        <application path="/" applicationPool="Clr4IntegratedAppPool">
            <virtualDirectory path="/" physicalPath="C:\Users\usr\Documents\Visual Studio 2012\Projects\MySite" />
        </application>
        <bindings>
            <binding protocol="http" bindingInformation="*:8081:localhost" />
            <binding protocol="http" bindingInformation="*:8082:localhost" />
            <binding protocol="http" bindingInformation="*:8083:192.168.2.102" />
        </bindings>
    </site>
  • Установите IISExpress для запуска как Administrator, чтобы он мог связываться с внешними адресами (а не с локальным хостом).
  • Запустите Visual Stuio как Administrator, чтобы он мог запустить процесс как администратор, позволяющий выполнять привязку.

В конечном итоге вы можете перейти к 192.168.2.102 в моем случае и тестировать (например, в эмуляторе Android. Я действительно надеюсь, что это поможет кому-то другому, поскольку это определенно вызывает раздражение для меня.

По-видимому, это функция безопасности, которую я бы хотел отключить.

Ответ 7

Ответ на предыдущий вопрос действителен. И эта информация мне очень помогла. Я знаю, что эта тема обсуждалась ранее, но я хотел добавить дополнительный ввод. Люди говорят, что вы должны "вручную редактировать" файл application.config в каталоге "Пользователи IISExpress/Config". Это было большой проблемой для меня, потому что я хотел распространять конфигурацию через Source control для разных разработчиков.

Я обнаружил, что вы можете автоматизировать обновление этого файла с помощью программы "C:\Program Files\IIS Express\appcmd.exe". Потребовалось время, чтобы выяснить параметры управления, но я поделился своими выводами здесь. По существу, вы можете создать файл .bat, который запускает как команду NETSH, так и APPCMD.EXE(и, возможно, поменять файл хоста, если хотите), чтобы упростить конфигурацию заголовка узла с помощью IIS Express.

Ваш установочный файл bat будет выглядеть примерно так:

netsh http add urlacl url=http://yourcustomdomain.com:80/ user=everyone 

"C:\Program Files\IIS Express\appcmd.exe" set site "MyApp.Web" /+bindings.[protocol='http',bindingInformation='*:80:yourcustomdomain.com']

Я также сделаю файл "Удалять" bat, который очистит эти привязки.. (потому что часто раз Im просто подделывает DNS, чтобы я мог работать с кодом, чувствительным к имени хоста)

netsh http delete urlacl url=http://yourcustomdomain.com:80/

"C:\Program Files\IIS Express\appcmd.exe" set site "MyApp.Web" /-bindings.[protocol='http',bindingInformation='*:80:yourcustomdomain.com']

Я надеюсь, что эта информация полезна кому-то. Мне потребовалось немного, чтобы раскрыть.

Ответ 8

Следуя совету Jaro, я смог получить эту работу под Windows XP и IIS Express (установленную через веб-матрицу) с небольшой модификацией и не ограничивался только локальным хостом. Это просто вопрос правильной настройки привязок.

  •  
  • Используйте WebMatrix для создания нового сайта из папки в корне вашего веб-приложения.  
  • Закрыть WebMatrix.  
  • Откройте %USERPROFILE%\My Documents\IISExpress\config\applicationhost.config (Windows XP. Vista и 7 путей будут похожи) и отредактируйте определение сайта в блоке конфигурации <sites>, чтобы оно соответствовало следующим строкам:

    <site name="DevExample" id="997005936">
        <application path="/" applicationPool="Clr2IntegratedAppPool">
            <virtualDirectory
                path="/"
                physicalPath="C:\path\to\application\root" />
        </application>
        <bindings>
            <binding
                protocol="http"
                bindingInformation="*:80:dev.example.com" />
        </bindings>
        <applicationDefaults applicationPool="Clr2IntegratedAppPool" />
    </site>

Если вы используете MVC, сохраните applicationPool в одной из "Интегрированных" опций.

Ответ 9

Как и Jessa Flint выше, я не хотел вручную редактировать .vs\config\applicationhost.config, потому что я хотел, чтобы изменения сохранялись в исходном управлении. Я также не хотел иметь отдельный командный файл. Я использую VS 2015.

Свойства проекта → События сборки → Командная строка события предварительной сборки: Снимок экрана свойств проекта


::The following configures IIS Express to bind to any address at the specified port

::remove binding if it already exists
"%programfiles%\IIS Express\appcmd.exe" set site "MySolution.Web" /-bindings.[protocol='http',bindingInformation='*:1167:'] /apphostconfig:"$(SolutionDir).vs\config\applicationhost.config"

::add the binding
"%programfiles%\IIS Express\appcmd.exe" set site "MySolution.Web" /+bindings.[protocol='http',bindingInformation='*:1167:'] /apphostconfig:"$(SolutionDir).vs\config\applicationhost.config"

Просто убедитесь, что вы изменили номер порта на нужный порт.

Ответ 10

Решение David - это хорошо. Но я обнаружил, что <script>alert(document.domain);</script> на странице все еще предупреждает "localhost", потому что Url Project все еще является локальным хостом, даже если он был переопределен с помощью http://dev.example.com. Другая проблема, с которой я столкнулся, заключается в том, что она предупреждает меня, что порт 80 уже используется, даже если я отключил Skype, используя номер порта 80, как рекомендовал Дэвид Мердок. Поэтому я понял другое решение, которое намного проще:

  • Запустите Блокнот как администратор и откройте C:\Windows\System32\drivers\etc\hosts, добавьте 127.0.0.1 mydomain и сохраните файл;
  • Откройте веб-проект с помощью Visual Studio 2013 (Примечание: также должен выполняться как администратор), щелкните правой кнопкой мыши проект → Свойства → Интернет (предположим, что URL-адрес проекта под опцией "IIS Express" http://localhost:33333/), затем измените его с http://localhost:33333/ на http://mydomain:333333/ Примечание. После этого изменения вы не должны нажимать кнопку "Создать виртуальный каталог" справа от поля "URL-адрес проекта" или кнопку "Сохранить" в Visual Studio, поскольку они не будут выполнены. Вы можете сохранить настройки после следующего шага 3.
  • Откройте% USERPROFILE%\Мои документы \IISExpress\config\applicationhost.config, найдите "33333: localhost", затем обновите его до "33333: mydomain" и сохраните файл.
  • Сохраните настройки, указанные на шаге 2.
  • Щелкните правой кнопкой мыши веб-страницу в вашей визуальной студии и нажмите "Просмотреть в браузере". Теперь страница будет открыта в http://mydomain:333333/, а <script>alert(document.domain);</script> на странице будет предупреждать "mydomain".

Примечание. Номер порта, указанный выше, считается 33333. Вам нужно изменить его на номер порта, установленный вашей визуальной студией.

Сообщение отредактировано: Сегодня я попробовал другое доменное имя и получил следующую ошибку: Не удалось запустить веб-сервер IIS Express. Не удалось зарегистрировать URL-адрес... Доступ запрещен. (0x80070005). Я выхожу из IIS Express, щелкнув правой кнопкой мыши значок IIS Express в правом углу панели задач Windows, а затем заново запустил свою визуальную студию в качестве администратора, и проблема исчезла.

Ответ 12

Оставляя это здесь на всякий случай, если кому-то нужно...

Мне нужно было иметь пользовательские домены для установки Wordpress Multisite в IIS Express, но ничего не работало, пока я не запустил Webmatrix/Visual Studio в качестве администратора. Затем мне удалось привязать поддомены к одному и тому же приложению.

<bindings> 
    <binding protocol="http" bindingInformation="*:12345:localhost" />
    <binding protocol="http" bindingInformation="*:12345:whatever.localhost" />
</bindings>

Затем перейдем к http://whatever.localhost:12345/.