在IIS Express中使用自定义域


304

传统上,我在本地主机开发服务器上使用自定义域。类似于以下内容:

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

当使用外部API(例如Facebook)时,这为我提供了很大的灵活性。过去使用内置的Visual Studio Development Server效果很好,因为我要做的就是将CNAME添加到指向的DNS记录中127.0.0.1

但是我无法使它与IIS Express一起使用。我尝试过的一切似乎都失败了。我什至在applicationHost.configIIS Express 的文件中添加了正确的XML配置,但似乎无法像IIS的真实安装一样识别这些条目。

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

每当我输入此行并尝试请求时http://dev.example.com:1288,都会收到以下消息:

错误的请求-无效的主机名

有人知道我是否缺少明显的东西吗?还是IIS Express团队真的缺乏见识这种类型的远见?


确保将应用程序节点的applicationPool属性设置为“ Clr2IntegratedAppPool”或“ Clr4IntegratedAppPool”。使用“ Clr2ClassicAppPool”或“ Clr4ClassicAppPool”时,出现错误的主机名错误。
尼尔·梦露

混淆-CNAME记录不接受IP地址,而是接​​受其他主机名。你是说唱片吗?
Scott Coates 2012年

1
我对此有很多问题,发现仅使用IIS而不是IIS Express更加容易
user0b101010 2012年

我也碰到了这个。我希望它只是查看端口号而忽略域。没有这种运气。希望我可以在端口上启用“全部接受”
布雷迪·莫里茨

现在投票!:我添加了一个UserVoice的建议visualstudio.uservoice.com/forums/121579-visual-studio/...
卢克Puplett

Answers:


367

这是对我有用的(针对VS 2013更新,请参阅2010的修订历史记录,对于VS 2015请参见:https : //stackoverflow.com/a/32744234/218971):

  1. 右键单击您的Web应用程序项目Properties▶▶ Web,然后Servers按以下方式配置该部分:
    • IIS Express ▼从下拉菜单中选择
    • 项目网址: http://localhost
    • 覆盖应用程序根URL: http://dev.example.com
    • 单击Create Virtual Directory(如果您在此处遇到错误,则可能需要禁用IIS 5/6/7/8,将IIS更改Default Site为port以外的任何其他内容:80,确保Skype未使用端口80等)。
  2. 可选:将设置Start URLhttp://dev.example.com
  3. 打开%USERPROFILE%\My Documents\IISExpress\config\applicationhost.config(Windows XP,Vista和7),并按照以下步骤在<sites>config块中编辑站点定义:

    <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>
    
  4. 如果运行MVC:确保将applicationPool设置为“集成”选项之一(例如“ Clr2IntegratedAppPool”)。

  5. 打开hosts文件并添加行127.0.0.1 dev.example.com
  6. ► Start 你的申请!

评论提供了一些很棒的建议:

  • 您可能需要以管理员身份运行Visual Studio。
  • 如果您想让其他开发人员看到IIS运行 netsh http add urlacl url=http://dev.example.com:80/ user=everyone
  • 如果希望该站点解析所有主机集 bindingInformation="*:80:"。使用任何端口,80都很方便。

12
这正是我所做的,是要写这篇文章的,但是您打败了我:-)作为附带说明,如果您想让其他开发人员查看您的IIS,则可能需要执行“ netsh http add urlacl url = dev.example.com:80 user = everyone“
EBarr 2011年

6
另外,如果您希望站点为所有主机解析,则可以使用:bindingInformation =“ *:80:”我使用此方法,以便localtunnel.com正常工作。
Lance Fisher

17
我收到拒绝访问错误。以管理员身份运行VS 2012可修复该问题。
xanadont 2012年

3
这是什么版本的IIS Express?我正在运行VS2012(我相信是IIS Express 8.0),并且当我单击“ Web属性”页面“服务器”区域下的“使用本地IIS服务器”单选按钮时,单击“使用IIS Express”复选框,然后尝试放入“ mydev.example.com ”,然后单击“创建虚拟目录”按钮,出现此错误“无法创建虚拟目录。无法创建网站mydev.example.com”。您必须为服务器名称指定“ localhost”。
Michael McCarthy

12
这是复杂的。一个人必须在几个不同的地方改变泡沫。很容易造成混乱。真的没有更简单的方法吗?
Anderson

151

对于Visual Studio 2015,以上答案中的步骤适用,但applicationhost.config文件位于新位置。在“解决方案”文件夹中,按照路径进行操作,如果您进行了升级,并且applicationhost.config在计算机上具有两个版本,这会造成混淆。

\.vs\config

在该文件夹中,您将看到您的applicationhost.config文件

或者,您可以只在解决方案文件夹中搜索.config文件,然后以这种方式找到它。

我个人使用了以下配置:

在此处输入图片说明

在我的主机文件中包含以下内容:

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时遇到问题,并意识到我的配置都没有被继承。


9
关键部分是添加第二个*:49707:绑定,而不是像其他许多答案中所建议的那样替换默认绑定*:49707:localhost。实际上,您必须以管理员身份运行VS(非常好!)。谢谢。
fracz

3
http://jam.127.0.0.1.xip.io/如果您不想修改主机文件,也可以使用URL 。另外,任何协作者都不需要修改他们的协作者。见xip.io
扎克·马丁

1
我认为值得一提的是,文件夹“ .vs”是隐藏的,一开始应显示为
令人失望的

3
我已经确认这也可以在Visual Studio 2017中使用。有趣的是,我不需要两个<binding>元素(只是第一个没有“ localhost”的元素)。但是,Visual Studio当然确实需要以管理员身份运行,这很烦人
Loren Paulsen

1
我只希望对我们这些不允许管理上进行任何操作的人有办法。完全禁止管理员特权的雇主/客户,对于如何安全地启用管理员特权,几乎一无所知。
史蒂夫·佩蒂弗

44

当将Visual Studio 2012与IIS Express结合使用时, 更改现有绑定不会永久起作用。(它可能在关闭VS之前一直有效,但是在那之后,情况确实变得一团糟。)

关键是保持现有的本地主机绑定并在其后添加新的绑定。

除非您以管理员身份运行,否则还需要运行netsh add urlacl(以向自己授予以标准用户身份运行非localhost站点的权限)。

如果要允许任何主机名,则整个过程如下:

  1. 创建您的Web应用程序,并找出它正在使用的端口(请参阅项目属性,“ Web”选项卡,“项目网址”)。
  2. 来自管理员的提示,运行以下命令(替换端口号与您在#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)。仅使用您的特定主机名的主机就足够了。


当浏览到mycustomhost:myportnr时,做同样的事情(第一种方法),我得到“服务不可用”。VS2012。我无法尝试第二个,因为在“我的文档”和在c:\ Program Files \ IIS Express中找到的applicationhost.config下没有IIS Express,我的Web应用程序没有配置...
firepol 2014年

2
在VS2013中,我发现只有当我以admin身份运行时,此配置才有效!(以非管理员身份运行,IIS Express似乎忽略了第二个绑定-如果我从通知图标中打开其UI,IIS将显示我的网站正在运行,但仅显示第一个绑定,并且我只能使用 localhost ...我以admin身份运行,它显示了UI中的两个绑定,并且都正常工作。)我用netsh添加了urlacls,但这似乎没有什么不同-IIS Express似乎甚至不尝试绑定而不是localhost。如果没有升高。
伊恩·格里菲斯

使用添加记录 *为我解决的 “服务不可用”。
jerone

您需要在端口443上使用HTTPS的情况如何?
基希卡

@Kixoka我正在尝试运行HTTPS。我设法使其正常运行,但是浏览器抱怨证书与域不匹配。我克服了这一点,但是所有资源随后都无法加载,因此没有图像,脚本或CSS。
由设计Prime在

24

无效的主机名表示您在IIS Express配置文件中配置的实际站点(最有可能)未运行。IIS Express没有像IIS那样的流程模型。


为了使您的站点运行,需要使用/ site参数显式启动它(通过从webmatrix打开或访问它,或者从命令行调用iisexpress.exe(从其安装目录))。


通常,以下步骤允许使用完全限定的DNS名称进行本地访问:让我们以您的DNS名称dev.example.com为例。

  1. 编辑%windows%\ system32 \ drivers \ etc \ hosts文件,将dev.example.com映射到127.0.0.1(需要管理员权限)。如果您控制DNS服务器(例如在Nick的情况下),则DNS条目就足够了,因为不需要此步骤。
  2. 如果您通过代理访问Internet,请确保不会将dev.example.com代理代理(您必须在浏览器的例外列表中添加(对于IE,它是“工具/ Internet选项/连接/局域网设置”,然后转到Proxy Server / Advanced,然后将dev.example.com放在实例列表中。
  3. 为您的站点(例如:Site1)配置IIS Express绑定以包括dev.example.com。使用绑定将需要管理特权。或者,可以使用http.sys使用以下方法进行一次URL保留:

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

  4. iisexpress /site:Site1在WebMatrix中启动或打开Site1


2
您好Jaro,感谢您的帮助,但是在我的DNS中设置了127.0.0.1而不是hosts文件,以便所有开发人员都具有相同的访问权限。其次,除非绑定设置为“ *:1234:localhost”(这是完全无用的设置),否则我无法使其在VS中开始调试,因为它绑定到了我计算机上的所有IP地址,但仅接受“ localhost”的主机头”。他们为什么不只做“ 127.0.0.1:1234:”而避免所有这些废话。只要IP和端口解析,就不需要主机头。对于大型团队来说,以Admin身份运行只会是一个巨大的痛苦。IIS Express是什么灾难。
Nick Berardi

1
同样,作为参考Bad Request - Invalid Hostname意味着我要使用的主机名无法解析,因为IIS Express团队以其无限的智慧决定专门调出“ localhost”作为唯一可行的主机头。并且VS不允许您使用除“ *:1234:localhost”之外的任何其他方式运行它
Nick Berardi

2
我在127.0.0.1问题上听到您的声音。绑定中的“本地主机”肯定很麻烦,因为它不包含127.0.0.1的流量。该设计受到当今http.sys(http协议处理程序)合同的限制,该合同仅将“ localhost”识别为非管理用途。可以通过使用http.sys进行一次URL保留来缓解仅管理员的要求(将更新上面的信息)。请告诉我您与Visual Studio的确切使用(它是带有SP1 Beta的VS2010吗?)。让我们尝试做更多的事情,(希望)解决这个问题。
Jaro Dunajsky 2011年

注意-如果看到netsh.exe错误87,则参数不正确-可能是因为您省略了主机名后的URI路径(/)。
Tim Lovell-Smith

19

在我的WebMatrix的IIS安装快车从改变"*:80:localhost""*:80:custom.hostname"工作没有(“坏主机名”,即使正确等\主机映射),但"*:80:" 没有工作-与没有的这里的其他答案所需的其他步骤。请注意,"*:80:*"这不会做到;省略第二个星号。


3
uuuum,"*:80:*"为我工作,但是后来我重新启动计算机,直到我将其更改为"*:80:",一切都很好,它才突然无法工作!谢谢。
CWSpear

2
最后!!还按照其他地方的所有步骤进行操作,最后删除*使其起作用,谢谢!
菲利普

只是在这里说这对我有用。我尝试了接受的答案,并将所有更改还原为您所说的内容,并且一切正常。我正在使用VS2013 Update4。
JasonWilczak

这似乎完美地工作。使用VS2017时,我不确定要在Project Url中放置什么内容以使其写入applicationhost.config文件中?是否可以通过VS IDE进行设置?
吉姆(Jim)

8

我试图将公共IP地址集成到我的工作流程中,但这些答案没有帮助(我喜欢将IDE用作IDE)。但是上面的内容使我找到了解决方案(经过2个小时的敲打使墙壁与Visual Studio 2012 / Windows 8集成后,终于可以为我工作了。

由VisualStudio在以下目录下生成的applicationhost.configC:\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模拟器中。我真的希望这对其他人有所帮助,因为这对我而言绝对是一个令人不快的过程。

显然,这是一项安全功能,我很乐意看到它被禁用。


8

上面的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"

只需确保将端口号更改为所需的端口即可。


这里有一个小的补充。确保创建规则以在Windows防火墙中打开该端口。然后,它就像一个魅力!
彼得M,

我喜欢您的回答,因为当多个开发人员在自己的计算机上运行IIS Express时,编辑.vs \ config \ applicationhost.config是不可行的。谢谢!
科林

6

投票赞成的答案是有效的。.此信息对我有很大帮助。我知道之前已经讨论过该主题,但是我想添加一些其他输入。人们说您必须“手动编辑” Users IISExpress / Config目录中的application.config文件。这对我来说是个大问题,因为我想通过Source控件将配置分发给各个开发人员。

我发现您可以使用“ C:\ Program Files \ IIS Express \ appcmd.exe”程序自动更新此文件。找出控制参数花了一段时间,但我在这里分享了我的发现。本质上,您可以制作一个同时运行NETSH命令和APPCMD.EXE的.bat文件(如果需要,还可以换出一个主机文件),以使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文件,以清理这些绑定。.(因为通常我只是在伪造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']

我希望这些信息对某人有帮助。.我花了一些时间才发现。


4

遵循Jaro的建议,我可以对Windows XP和IIS Express(通过Web Matrix安装)进行小的修改,而不仅限于本地主机。只需正确设置绑定即可。

  1. 使用WebMatrix从Web应用程序根目录中的文件夹创建一个新站点。
  2. 关闭WebMatrix。
  3. 打开%USERPROFILE%\My Documents\IISExpress\config\applicationhost.config (WindowsXP。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设置为“集成”选项之一。


3

大卫的解决方案很好。但是我发现<script>alert(document.domain);</script>页面中的仍然警告“ localhost”,因为即使已用重写了Project Url,仍然是localhost http://dev.example.com。我遇到的另一个问题是,即使我按照David Murdoch的建议使用80端口号禁用了Skype,它也会提醒我端口80已被使用。因此,我想出了另一个更简单的解决方案:

  1. 以管理员身份运行记事本,然后打开C:\ Windows \ System32 \ drivers \ etc \ hosts,添加127.0.0.1 mydomain,然后保存文件;
  2. 使用Visual Studio 2013打开Web项目(注意:还必须以管理员身份运行),右键单击项目->属性-> Web(假设“ IIS Express”选项下的项目网址为http://localhost:33333/),然后从http://localhost:33333/http://mydomain:333333/ 注意:此更改后,您应该既不点击项目地址框右侧的“创建虚拟目录”按钮,也没有点击的Visual Studio的保存按钮,因为他们不会成功。您可以在下一步3之后保存设置。
  3. 打开%USERPROFILE%\ My Documents \ IISExpress \ config \ applicationhost.config,搜索“ 33333:localhost”,然后将其更新为“ 33333:mydomain”并保存文件。
  4. 按照步骤2中所述保存设置。
  5. 右键单击Visual Studio中的网页,然后单击“在浏览器中查看”。现在,该页面将在下打开http://mydomain:333333/,并<script>alert(document.domain);</script>在该页面中提示“ mydomain”。

注意:上面列出的端口号假定为33333。您需要将其更改为Visual Studio设置的端口号。

编辑后:今天我尝试使用另一个域名,但收到以下错误:无法启动IIS Express Web服务器。无法注册URL ...访问被拒绝。(0x80070005)。我通过右键单击Windows任务栏中右上角的IIS Express图标退出IIS Express,然后以管理员身份重新启动Visual Studio,问题不再存在。


1
现在,是应该被视为正确解决方案的答案!请确保你,如果你使用Visual Studio 2015编辑位于.VS / config中的对ApplicationHost.config
法比奥Salvalai

1

我尝试了以上所有方法,但没有任何效果。解决此问题的方法是在hosts文件中添加IPv6绑定。在@David Murdochs答案的第5步中,添加两行而不是一行,即:

127.0.0.1 dev.example.com
::1 dev.example.com

我通过$ ping localhost从用于返回的命令行中检查得出来的:

Reply from 127.0.0.1: bytes=32 time<1ms TTL=128

相反,它现在返回:

Reply from ::1: time<1ms

我不知道为什么,但是由于某种原因,IIS Express开始使用IPv6而不是IPv4。



0

留在这里以防万一有人需要...

我需要为IIS Express中的Wordpress Multisite安装程序提供自定义域,但是在以管理员身份运行Webmatrix / Visual Studio之前,任何方法都无效。然后,我能够将子域绑定到同一应用程序。

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

然后转到http://whatever.localhost:12345 /将运行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.