URL Re-writing using web.confg - url

This is what I'm trying to achieve using web.config (My current web.config is used to force non-www which will still be needed)
The site was first hosted under a sub-folder and we moved it now to the root. This is what I'm trying to achieve now:
old url example: mysite.com/subfolder/prodView.asp?idproduct=1312&idCategory=44 should get redirected to mysite.com/prodView.asp?idproduct=1312&idCategory=44 (We need to get rid of the old subfolder)
This is will be needed as many customer have already saved products link in their browsers and also we posted 1000's on links on twitter and facebook that all include the sub-folder within.
Any help will be highly appreciated.
Current web.config
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Remove WWW prefix" stopProcessing="false">
<match url="(.*)" ignoreCase="true" />
<conditions>
<add input="{HTTP_HOST}" pattern="^www\.mysite\.com$" />
</conditions>
<action type="Redirect" url="http://mysite.com/{R:1}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

Add the following rule to your existing rule(s):
<rule name="Redirect old subfolder links" stopProcessing="false">
<match url="^subfolder/(.+)" ignoreCase="true" />
<action type="Redirect" url="/{R:1}" appendQueryString="true" redirectType="Permanent" />
</rule>

Related

How to host two applications under one domain

At the moment I have a wordpress website that covers my blogs. I have a asp.net mvc application that is my ecommerce application.
At the moment I'm looking to have them both under one domain, I'm wondering is that possible?
When visiting
TestWebSite.com it'll point to my wordpress
Currently I asp.net mvc application set as a subdomain shop.TestWebsite.com but I would like to have it as TestWebsite.com/shop
What I'm currently having trouble with is configuring the asp.net mvc application such that when they visit www.TestWebsite.com/shop it'll load that application.
Any tips would be greatly appreciated
Yes, is it possible using the UrlRewrite Module. Add your custom rules in your root web.config. Also, in wordpress folder you will have to add the respective wordpress rewrites (.htaccess to web.config converter online)
<system.webServer>
<rewrite>
<rules>
<rule name="SUBDOMAIN" stopProcessing="false">
<match url="(.*)"/>
<conditions>
<add input="{HTTP_HOST}" pattern="^SUBDOMAIN.domain.com$"/>
<add input="{PATH_INFO}" pattern="^/APPFOLDER/" negate="true"/>
<!-- This one! -->
</conditions>
<action type="Rewrite" url="APPFOLDER/{R:1}"/>
</rule>
<rule name="DOMAIN" stopProcessing="false">
<match url="(.*)"/>
<conditions>
<add input="{HTTP_HOST}" pattern="^DOMAIN.com$"/>
<add input="{PATH_INFO}" pattern="^/WORDPRESSFOLDER/" negate="true"/>
<!-- This one! -->
</conditions>
<action type="Rewrite" url="WORDPRESSFOLDER/{R:1}"/>
</rule>
</rules>
</rewrite>
</system.webServer>

IIS Rewrite and reverse proxy for multiple applications

I have an IIS 10 with a website configured on that. There are multiple Applications underneath that website.
MyWebsite/app1 - MyWebsite/app2 - MyWebsite/app3
I Have another server(let's call it EndServer) hosting 3 websites on 3 different ports.
well, now what I wanna do is using IIS as a reverse proxy to redirect and MASK the application 1 to one of those websites in 2nd server and application 2 to another one.
at the end, Users will enter https://mywebsite/app1 and they will see the contents of website 1 in the Endserver.
Note: it is important for me that end Users see the URL like as https://mywebsite/app1/
how shall I edit the Rule below:
<rewrite>
<rules>
<rule name="ReverseProxyInboundRule1" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="http://endserver:8052/{R:1}" />
<conditions trackAllCaptures="true">
</conditions>
</rule>
</rewrite>
Thanks
A.
According to your description, I suggest you could try to use below url rewrite rule.
<rule name="ReverseProxyInboundRule1" stopProcessing="true">
<match url="(.*)" />
<conditions trackAllCaptures="true">
<add input="{URL}" pattern="^/app1/(.*)" />
</conditions>
<action type="Rewrite" url="http://endserver:8052/{C:1}" />
</rule>
<rule name="ReverseProxyInboundRule2" stopProcessing="true">
<match url="(.*)" />
<conditions trackAllCaptures="true">
<add input="{URL}" pattern="^/app2/(.*)" />
</conditions>
<action type="Rewrite" url="http://endserver:8053/{C:1}" />
</rule>
Thanks for your answer.
I got same error. as you see below /App1 is missing in the URL after localhost:Port
localhost:8888/assets/styles/Custom.css?m=1549903616.0
I believe the trouble is with rewriting the response URL. I don't know who can I add the missing part in URL.
Regards.

Missing www in my url (on cellphone) causing "This connection is not private" ASP.NET MVC

I've just published my website, and I realized missing www in my (BUT ONLY ON CELLPHONE) url causing this issue:
It is interesting fact that if I type url without www on my computer or laptop website is working fine, but if I type url without www on my cellphone, that is message that I'm getting (screenshot above).
So
"https://example.com" // causing issue (because there is no www)
"https://www.example.com" // works fine on my cellphone
I must say that I've tried editing web.config file, and I added this rule which should redirect all non www to www url, so my web.config looks like this:
<rewrite>
<rules>
<rule name="Canonical Host Name" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^example\.com$" />
</conditions>
<action type="Redirect" url="http://www.example.com/{R:0}" redirectType="Permanent" />
</rule>
<rule name="HTTP to HTTPS redirect" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
</conditions>
<action type="Redirect" redirectType="Permanent" url="https://{HTTP_HOST}/{R:1}" />
</rule>
</rules>
</rewrite>
But I do not know what it's about, cuz it's causing issue only on cellphones looks like..
So any kind of help would be great!
Thanks
If you are using https://, all your urls must be with https://. If you will use http:// this will cause errors. Additionaly, you have to setup certificate for both https://www.sample.com and https://sample.com
And check your web.config you use http insted of https

Globally modify left part URL in MVC 4 / 5

I am using IIS 8.5 with MVC4 and MVC5.
Let´s assume that I have two websites where the URL of the first (WS1) is:
http://myapp.example.com
and the second website (WS2) URL is:
http://myapp.example.com/sub
(and is located on another port to which I want to forward)
Now, my problem is that all URLs generated by MVC (links etc) will use the left part of the URL and remove /sub within that application. Let´s say for instance that in WS2 I want to redirect the user to http://myapp.example.com/sub/login but it will become http://myapp.example.com/login instead.
I have tried IIS URL rewrites but it will only work first-time request that actually contain the /sub part, the URLs generated by MVC of course remains erroneously without the /sub part.
<rewrite>
<rules>
<rule name="Rewrite">
<match url="^Sub/(.*)" />
<action type="Rewrite" url="http://myapp.example.com/{R:1}" />
</rule>
</rules>
<outboundRules>
<rule name="Response Status Update" preCondition="ResponseStatus" stopProcessing="true">
<match serverVariable="RESPONSE_Location" pattern="^/(.*)" />
<action type="Rewrite" value="/Sub/{R:1}" />
</rule>
<rule name="RewriteRelativePaths" preCondition="IsHTML">
<match filterByTags="A, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script" pattern="^/(.*)" negate="false" />
<conditions>
<add input="{URL}" pattern="^/Sub/.*" />
</conditions>
<action type="Rewrite" value="/Sub/{R:1}" />
</rule>
<preConditions>
<preCondition name="IsHTML">
<add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
</preCondition>
<preCondition name="ResponseStatus">
<add input="{RESPONSE_STATUS}" pattern="3[0-9][0-9]" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
My question is how I can accomplish this. Using another subdomain is not an option.

IIS Rewrite Module and sub applications

Here's what I have deployed:
testRedirect is an empty website. All sub-applications are sub-folders that have been converted in application. All of them are ASP .Net MVC sites.
Here's what I want to setup:
Http://localhost/ must show the content of SiteName1 without
displaying Http://localhost/SiteName1/ in the adress bar (it must
stay Http://localhost/)
Http://localhost/SiteName1/ must show the content of SiteName1
without displaying Http://localhost/SiteName1/ in the adress bar
(it must stay Http://localhost/)
Http://localhost/SiteName2/ shows the content of SiteName2 and
displays Http://localhost/SiteName2/ in the adress bar (Same behavior for SiteName3 & SiteName4 and any other sites....)
In other words, I want my SiteName1 to act like a home site
What I've tried so far, is something similar to the answer provided by #cheesemacfly here:
<rules>
<rule name="Redirect if SiteName1" stopProcessing="true">
<match url="^SiteName1/(.*)$" />
<action type="Redirect" url="{R:1}" />
</rule>
<rule name="Rewrite to sub folder">
<match url="^.*$" />
<action type="Rewrite" url="SiteName1/{R:0}" />
</rule>
</rules>
It works great for Case1 & 2 but not the other ones.
I tried to add rules like this one, but it was not successful...
<rule name="if_not_SiteName1" stopProcessing="true">
<match url="^SiteName1/(.*)$" negate="true" />
<action type="None" />
</rule>
I think your best option would be to trigger the rewrite rule you already have only when the url doesn't start with one of your sub-applications.
It would be something like:
<rules>
<rule name="Redirect if SiteName1" stopProcessing="true">
<match url="^SiteName1/(.*)$" />
<action type="Redirect" url="{R:1}" />
</rule>
<rule name="Rewrite to sub folder">
<match url="^(SiteName2|SiteName3|SiteName4)/" negate="true" />
<action type="Rewrite" url="SiteName1/{R:0}" />
</rule>
</rules>
We keep the redirect when SiteName1/ is requested (we don't need to change this), but the rewrite rule is triggered only when the requested url doesn't start with SiteName2/ or SiteName3/ or SiteName4/ (that's what url="^(SiteName2|SiteName3|SiteName4)/" means and we use negate="true" to triggered the rule only when the pattern is not matched).

Resources