Search code examples
iisiis-7iis-express

Using Custom Domains With IIS Express


Traditionally I use custom domains with my localhost development server. Something along the lines of:

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

This has provided me a ton of flexibility when working with external APIs such as Facebook. This has worked great in the past with the built-in Visual Studio Development Server because all I needed to do was add a CNAME to those DNS records pointing to 127.0.0.1.

However, I have not been able to get this to work with IIS Express. Everything I have tried seems to have failed. I have even added the correct XML config to the applicationHost.config file for IIS Express, but it doesn't seem to recognize the entries as valid as a true install of IIS would.

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

Whenever I enter this line and try to request http://dev.example.com:1288 I get the following message:

Bad Request - Invalid Hostname

Does anybody know if I am missing something obvious? Or did the IIS Express team really lack the foresight to see this type of use?


Solution

  • This is what worked for me (Updated for VS 2013, see revision history for 2010, for VS 2015 see this: https://stackoverflow.com/a/32744234/218971):

    1. Right-click your Web Application Project ▶ PropertiesWeb, then configure the Servers section as follows:

      • Select IIS Express ▼ from the drop down
      • Project Url: http://localhost
      • Override application root URL: http://dev.example.com
      • Click Create Virtual Directory (if you get an error here you may need to disable IIS 5/6/7/8, change IIS's Default Site to anything but port :80, make sure Skype isn't using port 80, etc.)
    2. Optionally: Set the Start URL to http://dev.example.com

    3. Open %USERPROFILE%\My Documents\IISExpress\config\applicationhost.config (Windows XP, Vista, and 7) and edit the site definition in the <sites> config block to be along the lines of the following:

      <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. If running MVC: make sure the applicationPool is set to one of the "Integrated" options (like "Clr2IntegratedAppPool").

    5. Open your hosts file and add the line 127.0.0.1 dev.example.com.

    6. ► Start your application!

    Some great advice from the comments:

    • You may need to run Visual Studio as Administrator.
    • If you want to make other devs see your IIS run netsh http add urlacl url=http://dev.example.com:80/ user=everyone
    • If you want the site to resolve for all hosts set bindingInformation="*:80:". Use any port you want, 80 is just convenient. To resolve all hosts you'll need to run Visual Studio as an administrator