{"id":532,"date":"2026-08-04T02:03:12","date_gmt":"2026-08-04T02:03:12","guid":{"rendered":"https:\/\/windows-vps.org\/blog\/?p=532"},"modified":"2026-08-04T02:03:12","modified_gmt":"2026-08-04T02:03:12","slug":"iis-url-rewrite-reverse-proxy-setup","status":"publish","type":"post","link":"https:\/\/windows-vps.org\/blog\/iis-url-rewrite-reverse-proxy-setup\/","title":{"rendered":"IIS URL Rewrite and Reverse Proxy: Host Multiple Apps Behind One Windows VPS"},"content":{"rendered":"<p class=\"wp-block-paragraph\">One Windows VPS with a single public IP can host an ASP.NET Core site, a Node.js API, a static site, and a WordPress install at the same time. The glue is IIS with the URL Rewrite module, and when you add Application Request Routing (ARR) it doubles as a reverse proxy that routes traffic to apps on any internal port. Here is how the pieces fit together.<\/p>\n\n<p class=\"wp-block-paragraph\">Running several runtimes on one box means the RAM and CPU budget matters more than ever \u2014 <a href=\"https:\/\/windows-vps.org\/#providers\">our comparison table<\/a> shows which Windows VPS plans give you enough memory for IIS plus a couple of application runtimes.<\/p>\n\n<h2 class=\"wp-block-heading\">Install the Modules<\/h2>\n\n<p class=\"wp-block-paragraph\">URL Rewrite 2.1 and ARR 3.0 are free downloads from IIS.net, or via winget on modern Server installs:<\/p>\n\n<pre class=\"wp-block-code\"><code>winget install Microsoft.URLRewrite\nwinget install Microsoft.ApplicationRequestRouting<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">Both are ISAPI-level modules that plug into IIS without rebooting the server. Restart IIS once with <code>iisreset<\/code> and confirm both modules appear in IIS Manager under the server node. They are free and Microsoft-supported \u2014 the same rewrite engine Azure App Service uses internally, so you are configuring production-grade software on a small VPS.<\/p>\n\n<h2 class=\"wp-block-heading\">Rewrite Rules in web.config<\/h2>\n\n<p class=\"wp-block-paragraph\">Rules live in the web.config of each site, so they deploy with your code. A clean-URL rule that maps \/products\/123 to a query string:<\/p>\n\n<pre class=\"wp-block-code\"><code>\n  \n    \n      \n        \n          \n          \n        \n      \n    \n  \n<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">The {R:1} back-reference captures the first pattern group, and stopProcessing prevents later rules from overriding the match. Rules are evaluated top to bottom, so order matters \u2014 put specific rules before catch-alls.<\/p>\n\n<h2 class=\"wp-block-heading\">Reverse Proxy with ARR<\/h2>\n\n<p class=\"wp-block-paragraph\">With ARR installed and proxy mode enabled, a rewrite rule can forward traffic to an app listening on a different port \u2014 say a Node.js API on 3000 or a Python service on 8000:<\/p>\n\n<pre class=\"wp-block-code\"><code>\n  \n    \n    \n      \n        \n          \n          \n        \n      \n    \n  \n<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">ARR forwards the original Host header and handles WebSocket upgrades, so a Node.js chat app or SignalR hub proxies cleanly. For heavier setups, ARR also has a Server Farms UI that adds health checks, load balancing across multiple back-ends, and centralized caching.<\/p>\n\n<h2 class=\"wp-block-heading\">Multiple Sites, One IP<\/h2>\n\n<p class=\"wp-block-paragraph\">Beyond path-based routing, IIS natively hosts many sites on one IP by matching the Host header. Create one site per domain, bind each to port 80 with its own host name, and IIS routes requests by name \u2014 no extra public IPs needed. Combine that with per-site rewrite rules and the reverse proxy above, and a single VPS behaves like a small hosting platform. Verify bindings locally before pointing DNS at them:<\/p>\n\n<pre class=\"wp-block-code\"><code>curl -H \"Host: app1.example.com\" http:\/\/localhost\/<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">Create the bindings in IIS Manager or with New-WebBinding, then confirm each site answers its own host name before touching public DNS. Two sites can share port 80 with no conflict because IIS routes purely on the header \u2014 which is also why a wildcard binding on one site can shadow the others, so keep bindings explicit.<\/p>\n\n<h2 class=\"wp-block-heading\">Rewrite Maps for Static Translations<\/h2>\n\n<p class=\"wp-block-paragraph\">For a fixed set of old-to-new path pairs, a rewrite map is cleaner than a pile of rules. Define the map once, then reference it from a rule:<\/p>\n\n<pre class=\"wp-block-code\"><code>\n  \n    \n      \n      \n    \n  \n  \n    \n      \n      \n        \n      \n      \n    \n  \n<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">Maps are ideal for preserving old URLs after a migration \u2014 search engines and bookmarked links keep working while the underlying app changes completely.<\/p>\n\n<h2 class=\"wp-block-heading\">Outbound Rules<\/h2>\n\n<p class=\"wp-block-paragraph\">Everything so far is an inbound rule. Outbound rules rewrite the response \u2014 for example, rewriting absolute links in HTML returned by a back-end app so they point at the public hostname instead of localhost. This is often the missing piece when a proxied app loads but images and links resolve to the wrong address.<\/p>\n\n<h2 class=\"wp-block-heading\">Troubleshooting<\/h2>\n\n<ul class=\"wp-block-list\"><li>502.3 \/ 502.5 errors mean the back-end is not listening \u2014 test it directly with curl http:\/\/localhost:3000 on the server.<\/li><li>Rules not matching? Enable Failed Request Tracing (FREB) on the site and add a trace rule for the rewrite provider to see every rule evaluation.<\/li><li>The proxy silently does nothing if ARR is not installed \u2014 URL Rewrite alone cannot proxy; it needs the ARR proxy mode.<\/li><li>Double-check rule order: the first matching rule with stopProcessing wins.<\/li><\/ul>\n\n<p class=\"wp-block-paragraph\">One ordering trap catches most people: server-level rules execute before site-level rules. If a catch-all at the server level uses stopProcessing, your site-level rules never run \u2014 check the server node\u2019s web.config before debugging a rule that looks correct but never fires.<\/p>\n\n<p class=\"wp-block-paragraph\">Running several apps on one box is exactly where <a href=\"https:\/\/www.anrdoezrs.net\/click-101539688-17162719?sid=windowsvps\" target=\"_blank\" rel=\"noreferrer noopener sponsored\">Contabo<\/a>\u2019s RAM-per-dollar Windows VPS plans shine \u2014 one instance can carry IIS plus a Node and a Python service without breaking a sweat.<\/p>\n\n<p class=\"wp-block-paragraph\">URL Rewrite plus ARR gives a single Windows VPS the routing power you would expect from a dedicated proxy tier. Clean URLs, path-based routing to internal ports, and name-based multi-site hosting all come free with the OS. <a href=\"https:\/\/windows-vps.org\/#providers\">Compare plans side by side in our comparison table<\/a> to pick a host with enough RAM for multiple runtimes, then start consolidating.<\/p>","protected":false},"excerpt":{"rendered":"<p>One Windows VPS with a single public IP can host an ASP.NET Core site, a Node.js API, a static site, and a WordPress install at the same time. The glue is IIS with the URL Rewrite module, and when you add Application Request Routing (ARR) it doubles as a reverse proxy that routes traffic to &#8230; <a title=\"IIS URL Rewrite and Reverse Proxy: Host Multiple Apps Behind One Windows VPS\" class=\"read-more\" href=\"https:\/\/windows-vps.org\/blog\/iis-url-rewrite-reverse-proxy-setup\/\" aria-label=\"Read more about IIS URL Rewrite and Reverse Proxy: Host Multiple Apps Behind One Windows VPS\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":0,"footnotes":""},"categories":[5],"tags":[],"class_list":["post-532","post","type-post","status-publish","format-standard","hentry","category-tutorials-guides"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>IIS URL Rewrite and Reverse Proxy: Host Multiple Apps Behind One Windows VPS - Windows VPS Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/windows-vps.org\/blog\/iis-url-rewrite-reverse-proxy-setup\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"IIS URL Rewrite and Reverse Proxy: Host Multiple Apps Behind One Windows VPS\" \/>\n<meta property=\"og:description\" content=\"IIS URL Rewrite and Reverse Proxy: Host Multiple Apps Behind One Windows VPS\" \/>\n<meta property=\"og:url\" content=\"https:\/\/windows-vps.org\/blog\/iis-url-rewrite-reverse-proxy-setup\/\" \/>\n<meta property=\"og:site_name\" content=\"Windows VPS Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-04T02:03:12+00:00\" \/>\n<meta name=\"author\" content=\"windows-vps\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"windows-vps\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/windows-vps.org\/blog\/iis-url-rewrite-reverse-proxy-setup\/\",\"url\":\"https:\/\/windows-vps.org\/blog\/iis-url-rewrite-reverse-proxy-setup\/\",\"name\":\"IIS URL Rewrite and Reverse Proxy: Host Multiple Apps Behind One Windows VPS - Windows VPS Blog\",\"isPartOf\":{\"@id\":\"https:\/\/windows-vps.org\/blog\/#website\"},\"datePublished\":\"2026-08-04T02:03:12+00:00\",\"author\":{\"@id\":\"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58\"},\"breadcrumb\":{\"@id\":\"https:\/\/windows-vps.org\/blog\/iis-url-rewrite-reverse-proxy-setup\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/windows-vps.org\/blog\/iis-url-rewrite-reverse-proxy-setup\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/windows-vps.org\/blog\/iis-url-rewrite-reverse-proxy-setup\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/windows-vps.org\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"IIS URL Rewrite and Reverse Proxy: Host Multiple Apps Behind One Windows VPS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/windows-vps.org\/blog\/#website\",\"url\":\"https:\/\/windows-vps.org\/blog\/\",\"name\":\"Windows VPS Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/windows-vps.org\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58\",\"name\":\"windows-vps\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g\",\"caption\":\"windows-vps\"},\"sameAs\":[\"https:\/\/windows-vps.org\/blog\"],\"url\":\"https:\/\/windows-vps.org\/blog\/author\/myxiechengxuan\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"IIS URL Rewrite and Reverse Proxy: Host Multiple Apps Behind One Windows VPS - Windows VPS Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/windows-vps.org\/blog\/iis-url-rewrite-reverse-proxy-setup\/","og_locale":"en_US","og_type":"article","og_title":"IIS URL Rewrite and Reverse Proxy: Host Multiple Apps Behind One Windows VPS","og_description":"IIS URL Rewrite and Reverse Proxy: Host Multiple Apps Behind One Windows VPS","og_url":"https:\/\/windows-vps.org\/blog\/iis-url-rewrite-reverse-proxy-setup\/","og_site_name":"Windows VPS Blog","article_published_time":"2026-08-04T02:03:12+00:00","author":"windows-vps","twitter_card":"summary_large_image","twitter_misc":{"Written by":"windows-vps","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/windows-vps.org\/blog\/iis-url-rewrite-reverse-proxy-setup\/","url":"https:\/\/windows-vps.org\/blog\/iis-url-rewrite-reverse-proxy-setup\/","name":"IIS URL Rewrite and Reverse Proxy: Host Multiple Apps Behind One Windows VPS - Windows VPS Blog","isPartOf":{"@id":"https:\/\/windows-vps.org\/blog\/#website"},"datePublished":"2026-08-04T02:03:12+00:00","author":{"@id":"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58"},"breadcrumb":{"@id":"https:\/\/windows-vps.org\/blog\/iis-url-rewrite-reverse-proxy-setup\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/windows-vps.org\/blog\/iis-url-rewrite-reverse-proxy-setup\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/windows-vps.org\/blog\/iis-url-rewrite-reverse-proxy-setup\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/windows-vps.org\/blog\/"},{"@type":"ListItem","position":2,"name":"IIS URL Rewrite and Reverse Proxy: Host Multiple Apps Behind One Windows VPS"}]},{"@type":"WebSite","@id":"https:\/\/windows-vps.org\/blog\/#website","url":"https:\/\/windows-vps.org\/blog\/","name":"Windows VPS Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/windows-vps.org\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58","name":"windows-vps","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g","caption":"windows-vps"},"sameAs":["https:\/\/windows-vps.org\/blog"],"url":"https:\/\/windows-vps.org\/blog\/author\/myxiechengxuan\/"}]}},"_links":{"self":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts\/532","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/comments?post=532"}],"version-history":[{"count":1,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts\/532\/revisions"}],"predecessor-version":[{"id":539,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts\/532\/revisions\/539"}],"wp:attachment":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/media?parent=532"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/categories?post=532"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/tags?post=532"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}