题 使用IIS Express自定义域


传统上我使用自己的localhost开发服务器自定义域。有点像:

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

在使用Facebook等外部API时,这为我提供了很大的灵活性。这在过去使用内置的Visual Studio开发服务器时效果很好,因为我需要做的就是向那些指向的DNS记录添加一个CNAME。 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团队是否真的缺乏远见才能看到这种用途?


267
2018-01-17 00:16


起源


确保将应用程序节点的applicationPool属性设置为“Clr2IntegratedAppPool”或“Clr4IntegratedAppPool”。我在使用“Clr2ClassicAppPool”或“Clr4ClassicAppPool”时看到了Bad Hostname错误。 - Neil Monroe
confused - CNAME记录不接受ip地址,而是接​​受其他主机名。你是说A记录吗? - Scott Coates
我有很多问题,发现使用IIS而不是IIS Express更容易 - user0b101010
我也碰到了这个。我希望它只是查看端口号并忽略域。没有这样的运气。希望我能在港口启用“全部接受”.... - Brady Moritz
现在投票!我添加了UserVoice建议: visualstudio.uservoice.com/forums/121579-visual-studio/... - Luke Puplett


答案:


这对我有用(更新了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
    • 点击 创建虚拟目录 (如果您在此处收到错误,则可能需要禁用IIS 5/6/7/8,更改IIS Default Site 到港口以外的任何地方 :80, 确保 Skype没有使用80端口等)
  2. 可选:设置 Start URL 至 http://dev.example.com
  3. 打开 %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>
    
  4. 如果运行MVC:确保 applicationPool 设置为“集成”选项之一(如“Clr2IntegratedAppPool”)。

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

评论提出了一些很好的建议:

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

336
2018-03-03 21:18



这正是我所做的,即将写出来,但是你打败了我:-)作为旁注,如果你想让其他开发者看到你的IIS你可能想要做一些像“netsh http add urlacl网址=dev.example.com:80 用户=大家” - EBarr
此外,如果您希望站点解析所有主机,您可以使用:bindingInformation =“*:80:”我使用这个,所以localtunnel.com工作。 - Lance Fisher
我收到了拒绝访问错误。运行VS 2012作为管理员修复它。 - xanadont
这是什么版本的IIS Express?我正在运行VS2012(我认为是IIS Express 8.0),当我单击Web属性页的“Servers”区域下的“Use Local IIS Server”radiobutton时,单击Use IIS Express复选框,然后尝试摆在 ”mydev.example.com”;,然后点击“创建虚拟目录”按钮,我收到此错误“无法创建虚拟目录。无法创建网站mydev.example.com”。您必须为服务器名称指定“localhost”。 - Michael McCarthy
这是复杂的。一个人必须改变几个不同地方的节日。很容易弄得一团糟。真的没有更简单的方法吗? - Anderson


对于 Visual Studio 2015 上述答案中的步骤适用但是 applicationhost.config 文件位于新位置。在你的“解决方案”文件夹中按照路径,如果你升级并且有两个版本的话,这会令人困惑 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

我希望这有助于某些人,我在尝试升级到2015年的Visual Studio时遇到了问题,并意识到我的配置都没有被转移。


124
2017-09-23 15:56



应该更多地回答这个答案。谢谢。 - Tom
关键部分是 加 第二 *:49707: 绑定而不是 更换 默认 *:49707:localhost 如许多其他答案所示。而且你必须以管理员的身份运行VS(sic!)。谢谢。 - fracz
你也可以使用像这样的URL http://jam.127.0.0.1.xip.io/ 如果您不想修改您的主机文件。此外,任何合作者都不需要修改他们的。看到 xip.io。 - Zack Martin
我认为值得注意的是,文件夹“.vs”是隐藏的,应该首先显示 - Disappointed
我已经确认这也适用于Visual Studio 2017。有趣的是,我不需要两个<binding>元素(只是没有“localhost”的第一个)。但是,Visual Studio当然需要以管理员身份运行,这有点烦人 - Loren Paulsen


将Visual Studio 2012与IIS Express一起使用时, 改变 现有绑定不会永久有效。 (它可能会工作,直到你关闭VS,但在那之后,事情变得非常混乱。)

关键是保持现有的localhost绑定和 加入 一个新的绑定后。

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

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

  1. 创建您的Web应用程序,并找出它正在使用的端口(请参阅项目属性,Web选项卡,Project Url)。
  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(通常在My Documents \ 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);只有具有您特定主机名的那个就足够了。


42
2018-02-19 21:19



浏览时是否一样(第一种方法) mycustomhost:myportnr 我得到“服务不可用”。 VS2012。我无法尝试第二个,因为在“我的文档”和applicationhost.config下没有IIS Express我在c:\ Program Files \ IIS中找不到我的Web应用程序没有配置... - firepol
确认仍然适合VS2012。 - Nicholi
使用VS2013,我发现此配置仅在我以管理员身份运行时才有效! (作为非管理员运行,IIS Express似乎忽略了第二个绑定 - 如果我从通知图标打开它的UI,IIS显示我的网站正在运行,但只显示第一个绑定,我只能使用 本地主机...如果我以管理员身份运行,它会在UI中显示两个绑定,并且都可以工作。)我已经添加了带netsh的urlacls,但这似乎没有区别 - IIS Express似乎甚至没有尝试绑定除了localhost之外的任何东西,如果它没有提升。 - Ian Griffiths
添加记录 * 为我解决了“服务不可用”。 - jerone
如何在端口443上使用HTTPS? - Kixoka


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


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


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

  1. 编辑%windows%\ system32 \ drivers \ etc \ hosts文件以将dev.example.com映射到127.0.0.1(需要管理员权限)。如果您控制DNS服务器(如在Nick的情况下),则DNS条目就足够了,因为不需要此步骤。
  2. 如果您通过代理访问互联网,请确保dev.example.com不会被要求代理(您必须在浏览器中插入例外列表(对于IE,它将是工具/ Internet选项/连接/ Lan设置,然后转到Proxy Server / Advanced并将dev.example.com放在exeption列表中。
  3. 为您的站点配置IIS Express绑定(例如:Site1)以包含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


23
2018-01-17 21:21



嗨Jaro,感谢您的帮助,但在我的DNS中设置127.0.0.1而不是hosts文件,以便所有开发人员都具有相同的访问权限。其次我不能让它在VS中开始调试,除非绑定被设置为“*:1234:localhost”,这是一个完全无用的设置,因为它绑定到我的机器上的所有IP地址但只接受“localhost”的主机头”。为什么他们不只是做“127.0.0.1:1234:”并避免所有这些废话。只要IP和端口解析,就不需要主机头。对于大型团队而言,以管理员身份运行只是一个巨大的痛苦。 IIS Express是多么灾难。 - Nick Berardi
也只是作为参考 Bad Request - Invalid Hostname 意味着我尝试使用的主机名无法解析,因为IIS Express团队以其无限的智慧决定专门调出“localhost”作为唯一可行的主机头。除了“*:1234:localhost”之外,VS不会让你以任何其他方式运行它 - Nick Berardi
我在127.0.0.1问题上听到了你的意见。绑定中的“localhost”肯定是一种痛苦,因为它不包含流量 127.0.0.1 。该设计受到今天的http.sys(http协议处理程序)合同的限制,该合同仅为非管理用途识别“localhost”。使用http.sys进行一次性URL保留可以减轻管理员的要求(将更新上面的信息)。请告诉我您使用Visual Studio的确切用法(它是带有SP1 Beta的VS2010?)。让我们尝试更多地工作,并(希望)解决问题。 - Jaro Dunajsky
netsh在Windows 7上为我做了诀窍 - Fabrice
注意 - 如果您看到netsh.exe错误87该参数不正确 - 可能是因为您在主机名后省略了URI路径(/)。 - Tim Lovell-Smith


在我的WebMatrix IIS Express安装中更改 "*:80:localhost" 至 "*:80:custom.hostname" 没有工作(“Bad Hostname”,即使有正确的etc \ hosts映射),但是 "*:80:"  没有 工作 - 这里没有其他答案所需的其他步骤。注意 "*:80:*" 不会这样做;留下第二个星号。


18
2017-07-31 17:06



uuuum,所以 "*:80:*" 为我工作,但后来我重新启动了我的电脑,直到我把它更改为它突然不起作用 "*:80:" 一切都很好!谢谢。 - CWSpear
+1以4步进入。工作出色。 - Todd Menier
最后!!也遵循其他地方的所有步骤,并删除最后的*使其工作,谢谢! - Charles Philip
就在这里说这对我有用。我尝试了接受的答案,并将所有更改恢复到您所说的内容,并且一切正常。我正在使用VS2013 Update4。 - JasonWilczak
这似乎完美无缺。使用VS2017时,我不确定将什么放在Project Url中,让它在applicationhost.config文件中写入?是否可以通过VS IDE进行设置? - Jim


我试图将公共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
2018-01-22 21:54



我很想给出一个关于头部殴打的额外奖励,同样的狗屎在这里。 - BanditoBunny


遵循Jaro的建议,我能够在Windows XP和IIS Express(通过Web Matrix安装)下进行一些小修改,并且不仅限于localhost。这只是正确设置绑定的问题。

  1. 使用WebMatrix从Web应用程序根目录中的文件夹创建新站点。
  2. 关闭WebMatrix。
  3. 打开 %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设置为“Integrated”选项之一。


4
2018-02-18 18:37





最高投票的答案是有效的..这些信息对我有所帮助。我知道之前讨论过这个话题,但我想补充一些额外的输入。 人们说你必须在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
2018-01-01 11:15





像上面的Jessa Flint一样,我不想手动编辑 .VS \ CONFIG \对ApplicationHost.config 因为我希望更改在源代码管理中持续存在。我也不想有一个单独的批处理文件。我在用着 VS 2015

项目属性→构建事件→预构建事件命令行: Screenshot of project properties


::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"

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


3
2017-08-05 16:17



这里有一个小的补充。确保创建规则以在Windows防火墙中打开该端口。然后它就像一个魅力! - Peter M
我喜欢你的答案,因为当多个开发人员在自己的机器上运行IIS Express时,编辑.vs \ config \ applicationhost.config是不可行的。谢谢! - Colin


大卫的解决方案很好。但我找到了 <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”选项下的项目URL是 http://localhost:33333/),然后改变它 http://localhost:33333/ 至 http://mydomain:333333/ 注意:完成此更改后,您既不应单击“项目URL”框右侧的“创建虚拟目录”按钮,也不应单击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,问题就消失了。


3
2017-08-31 19:44



现在, 这个 是应该被认为是正确解决方案的答案!如果您使用的是visual studio 2015,请确保编辑位于.vs / config中的applicationhost.config。 - Fabio Salvalai


我正在使用iisexpress-proxy(来自npm)。

https://github.com/icflorescu/iisexpress-proxy


0
2018-02-23 14:50