使用IIS Express使用自定义域

传统上,我在本地主机开发服务器上使用自定义域。大致如下:

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

这为我在使用外部api(如Facebook)时提供了很大的灵活性。这在过去与内置的Visual Studio Development Server一起工作得很好,因为我所需要做的只是向指向127.0.0.1的DNS记录添加一个CNAME。

但是,我还不能让它与IIS Express一起工作。我所做的一切努力似乎都失败了。我甚至已经为IIS Express的applicationHost.config文件添加了正确的XML配置,但它似乎不能像真正安装IIS那样识别有效的条目。

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

每当我进入这一行并尝试请求http://dev.example.com:1288时,我都会得到以下消息:

错误请求-无效的主机名

有人知道我是否遗漏了什么明显的东西吗?或者IIS Express团队真的缺乏预见到这种类型的使用?

182723 次浏览

无效的主机名表明您在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. 如果您通过代理访问internet,请确保dev.example.com不会被转发到代理(您必须将其放在浏览器的例外列表中(对于IE,它将是工具/ internet选项/连接/Lan设置,然后转到代理服务器/高级,并将dev.example.com放在例外列表中)。
  3. 为您的站点(例如:Site1)配置IIS Express绑定以包括dev.example.com。使用绑定需要管理权限。或者,可以使用http进行一次性URL预订。系统使用

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

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

按照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>

If running MVC, then keep the applicationPool set to one of the "Integrated" options.

这对我来说是有效的(为VS 2013更新,参见2010年的修订历史,对于VS 2015,请参阅这个:https://stackoverflow.com/a/32744234/218971):

  1. 右键单击您的Web应用程序项目▶Properties▶abc1,然后如下所示配置Servers部分:

    • 从下拉菜单中选择IIS Express▼
    • 项目Url: 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只是方便。要解析所有主机,您需要以管理员身份运行Visual Studio

在我的WebMatrix IIS Express安装中,从"*:80:localhost"更改为"*:80:custom.hostname"没有工作(“坏主机名”,即使有适当的etc\hosts映射),但"*:80:" 做了工作-并且没有其他答案所需的额外步骤。注意"*:80:*"不会这样做;去掉第二个星号。

我试图将公共IP地址集成到我的工作流程中,这些答案没有帮助(我喜欢使用IDE作为IDE)。但以上这些让我找到了解决方案 (我花了大约2个小时的时间才把它与Visual Studio 2012 / Windows 8集成起来)下面是我最终得到的结果。< / p >

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运行,以便它可以绑定到外部地址(而不是本地主机)
  • Administrator的身份运行Visual studio,这样它就可以以管理员的身份启动这个过程,从而允许绑定发生。

最终结果是你可以在我的情况下浏览到192.168.2.102并测试(例如在Android模拟器中)。我真的希望这能帮助到其他人,因为这对我来说绝对是一个恼人的过程。

显然,这是一个安全功能,我希望看到禁用。

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

关键是保留现有的localhost绑定和添加之后的一个新绑定。

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

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

  1. 创建您的web应用程序,并找出它正在使用的端口(参见项目属性,web选项卡,项目Url)。
  2. 在管理员提示符下,运行以下命令(将portnumber替换为您在#1中计算出的端口号):

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

You can also use your user name (DOMAIN\USER) instead of everyone for better security.

  1. Open applicationhost.config (usually under My Documents\IIS Express\config), and find the element with your port number.
  2. Add one more binding with the host name you want (in this case, *). For example:

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

Note that, if want to open up all host names (*), you'll need two netsh commands (one for * and one for localhost). If you only want to open up a specific host name, you don't strictly need the second netsh command (localhost); just the one with your specific host name is sufficient.

向上投票的答案有效..这些信息对我帮助很大。我知道这个话题之前已经讨论过了,但我想添加一些额外的输入。 人们说您必须“手动编辑”应用程序。“Users IISExpress/ config”目录下的config文件。这对我来说是一个大问题,因为我想通过源代码控制将配置分发给不同的开发人员

我发现你可以使用“C:\Program Files\IIS Express\appcmd.exe”程序自动更新这个文件。找到控制参数需要一段时间,但我将在这里分享我的发现。本质上,您可以创建一个.bat文件,运行NETSH命令和APPCMD.EXE(如果您愿意,也可以换出一个主机文件),以便使用IIS Express轻松配置主机头。

你的install 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']

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

对于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。配置文件:

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

我使用iisexpress-proxy(从npm)来实现这一点。

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

洁莎·弗林特一样,我不想手动编辑.vs \ config \ applicationhost.config,因为我想让这些更改持续存在于源代码控制中。我也不想有一个单独的批处理文件。我正在使用VS 2015

项目属性→构建事件→预构建事件命令行: 项目属性截图 < / p >


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


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

大卫的解决办法很好。但我发现页面中的<script>alert(document.domain);</script>仍然警告“localhost”,因为项目Url仍然是localhost,即使它已经被http://dev.example.com覆盖。我遇到的另一个问题是,它提醒我端口80已经在使用,即使我已经禁用Skype使用80端口号,由大卫默多克推荐。所以我想出了另一个更简单的解决方案:

  1. 以管理员身份运行记事本,打开“C:\Windows\System32\drivers\etc\hosts”文件,添加“127.0.0.1 mydomain”,保存文件;
  2. 使用Visual Studio 2013打开web项目(注意:也必须以管理员身份运行),右键单击项目-> Properties -> web,(假设“IIS Express”选项下的项目Url为http://localhost:33333/),然后将其从http://localhost:33333/更改为http://mydomain:333333/ 注意:更改后,既不能点击Project Url框右侧的“创建虚拟目录”按钮,也不能点击Visual Studio的“保存”按钮,否则不会成功。 . .
  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失败…访问被拒绝。(0 x80070005)。我通过右键单击Windows任务栏右下角的IIS Express图标退出IIS Express,然后以管理员身份重新启动我的visual studio,问题就解决了。

把这个留在这里,以防有人需要…

我需要在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/将运行。

我试了以上所有的方法,都没用。解决这个问题的方法是在hosts文件中添加IPv6绑定。在@David murdoch回答的第五步中,添加两行而不是一行,即:

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。

并对该方法进行了测试。NET Core 3.1和Visual Studio 2019。

.vs \ PROJECTNAME \ config \ applicationhost.config

改变“*:44320:localhost"“*:44320:*“。

<bindings>
<binding protocol="http" bindingInformation="*:5737:localhost" />
<binding protocol="https" bindingInformation="*:44320:*" />
</bindings>

这两个链接都有效:

  • https://localhost:44320
  • < a href = " https://127.0.0.1:44320 " rel = " noreferrer > https://127.0.0.1:44320 < / >

现在,如果你想让应用程序使用自定义域,只需在宿主文件中添加以下一行:

C:\Windows\System32\drivers\etc\hosts

127.0.0.1 customdomain

现在:

  • https://customdomain:44320

注意:如果你的应用没有SSL,请更改协议="http"部分。

以防万一有人需要…

我的要求是:

  • 启用SSL
  • 自定义的域
  • 运行在(默认)端口:443

在IISExpress中设置这个URL: http://my.customdomain.com

为了设置这个,我使用了以下设置:

项目Url: http://localhost:57400

开始URL: http://my.customdomain.com

/.vs/{solution-name}/config/applicationhost.config设置:

<site ...>
<application>
...
</application>
<bindings>
<binding protocol="http" bindingInformation="*:57400:" />
<binding protocol="https" bindingInformation="*:443:my.customdomain.com" />
</bindings>
</site>