Change URL Rewrite Rule in Web.Config from Code C# - c#

I want to modify rewrite rule from C# code. Url Rewrite rule is resides in web.config file.
<system.webServer>
<rewrite>
<rules>
<rule name="partners">
<match url="^partners$" />
<action type="Rewrite"
url="partners.aspx" />
</rule>
<rule name="news">
<match url="^news$" />
<action type="Rewrite"
url="news.aspx" />
</rule>
<rule name="projects">
<match url="^projects$" />
<action type="Rewrite"
url="projects.aspx" />
</rule>
</rules>
</rewrite>
</system.webServer>
I want to change for ex. <rule name="partners"> <match url="^partners$" /> to <rule name="partners"> <match url="^friendship/partners$" />,
how can I find node rule and update match url to "new one" where name = "partners";?
this is my idea for dynamic url rewriting. thanks for any other ways if you have.

I change value for connectionString in my web.config website with this code :
May be this example can help you (just change the value connectionString by system.webServer and add by rules etc..
Please tell me if it works for you
XmlDocument myXmlDocument = new XmlDocument();
myXmlDocument.Load("../myPath/web.config");
foreach (XmlNode node in myXmlDocument["configuration"]["connectionStrings"])
{
if (node.Name == "add")
{
if (node.Attributes.GetNamedItem("name").Value == "SCI2ConnectionString")
{
node.Attributes.GetNamedItem("connectionString").Value = "new value";
}
}
}

step 1:- download urlrewrite2.exe Here
Step 2:- write you logic in web.config
<system.webServer>
<rewrite>
<providers>
<provider name="FileMap" type="FileMapProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=7.1.761.0, Culture=neutral, PublicKeyToken=0545b0627da60a5f">
<settings>
<add key="FilePath" value="D:\j\branches\JuzBuzz\App_Data\rewriteurl.txt" />
<add key="IgnoreCase" value="1" />
<add key="Separator" value="," />
</settings>
</provider>
</providers>
<rules>
<rule name="FileMapProviderTest" stopProcessing="true">
<match url="(.*)" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{FileMap:{R:1}}" pattern="(.+)" ignoreCase="false" />
</conditions>
<action type="Rewrite" url="{C:1}" appendQueryString="false" />
</rule>
</rules>
</rewrite>
</system.webServer>
step 3:- Put you .txt file in App_Code folder or another place for which you have given the address in web.config , txt file will have data like
**technology,expert/search-expert.aspx?CatId=1
counselling-personal-growth,expert/search-expert.aspx?CatId=2** etc**

Microsoft has Microsoft.Web.Administration.dll available to help you out, but it requires administrator permissions to execute,
https://www.iis.net/learn/manage/scripting/how-to-use-microsoftwebadministration
It is quite suitable for a WinForms application (such as IIS Manager) to control an IIS server, but can also be used in other types of applications.
I do have a personal project that is a custom MWA implementation that works for some non-administrator cases. If you are interested in it, let me know.

Related

Alternate way to "<rewrite>" web.config. How to accomplish it programatically. WCF

I have the following two rules for my WCF:
<system.webServer>
<rewrite>
<rules>
<!-- Rewrite requests to /MyService to /MyService.svc -->
<rule name="MyService" stopProcessing="false">
<match url="MyService/(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
</conditions>
<action type="Rewrite" url="/MyService.svc/{R:1}" />
</rule>
<!-- Remove path /MoreServices from url -->
<rule name="example" stopProcessing="true">
<match url=".*(MoreServices)(.+)" ignoreCase="true" />
<action type="Rewrite" url="{R:2}" />
</rule>
</rules>
</rewrite>
</system.webServer>
The first rule:
<!-- Rewrite requests to /MyService to /MyService.svc -->
<rule name="MyService" stopProcessing="false">
<match url="MyService/(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
</conditions>
<action type="Rewrite" url="/MyService.svc/{R:1}" />
</rule>
Rewrites calls that get sent without the svc extension to the svc service.
The second rule:
<!-- Remove path /MoreServices from url -->
<rule name="example" stopProcessing="true">
<match url=".*(MoreServices)(.+)" ignoreCase="true" />
<action type="Rewrite" url="{R:2}" />
</rule>
Removes an extra path and directs to the correct service.
Everything works fine, however, the site I will be publishing to does not allow the <rule> tag to be used in the web.config. My question is, how can I modify my WCF to accomplish the two rules above programmatically. Basically duplicating the logic of the two items mentioned above in C# as part of the WCF service. Thank You.
I found the solution!
Very easy to fix, first remove the entire <rewrite> section from your web.config. Then just add new file (type global.asax) to your project if you do not already have it.
Add the following code in the Application_BeginRequest method:
protected void Application_BeginRequest(object sender, EventArgs e)
{
// Raw URL
HttpContext context = HttpContext.Current;
string rawUrl = context.Request.RawUrl;
// Extra Path to be removed
const string EXTRA_PATH = "/MoreServices";
// Rewrite requests to /MyService to /MyService.svc
if (!rawUrl.Contains(".svc"))
{
// Index of last forward slash
int idxLastSlash = rawUrl.LastIndexOf('/');
// Insert .svc before last slash
rawUrl = rawUrl.Insert(idxLastSlash, ".svc");
}
// Remove extra path EXTRA_PATH from url
if (rawUrl.Contains(EXTRA_PATH))
{
// Remove extra path
rawUrl = rawUrl.Replace(EXTRA_PATH, "");
}
// Rewrite Path if it has been modified
if (rawUrl != context.Request.RawUrl)
{
// Note: Added "~" to avoid error: "The virtual path XX maps to another application, which is not allowed."
context.RewritePath("~" + rawUrl, false);
}
}
This will work the same way as the two rules above in the web.config. Hope this will help someone.

If user is coming from domain testx.com, rewrite url to mydomain.com/testx

I have an ASP.Net website, but several domain names are pointing to the same website.
so for example lets say i have following domains
www.myMainDomain.com
www.mySite1.com
www.mySite2.com
I have 1 actual website with all the pages and subpages i want to have.
www.myMainDomain.com
www.myMainDomain.com/site1
www.myMainDomain.com/site1/products
www.myMainDomain.com/site2
www.myMainDomain.com/site2/products
...
So i would like to have a rewrite rule in my web.config
so that if the user is coming from the www.myMainDomain.com, it is just the normal site as it is existing
but if they are coming from www.mySite1.com, the rewrite rule should kind of take them to www.myMainDomain.com/site1, and if they go to a subpage, like products, it is always rewritten so like this
www.mySite1.com -> www.myMainDomain.com/site1
www.mySite1.com/products -> www.myMainDomain.com/site1/products
I have something like that, but this is not working, and it is actually causing a 500 Error
<system.webServer>
<rewrite xdt:Transform="Insert">
<rules>
<rule name="Root Hit Redirect" stopProcessing="true">
<match url="^$" />
<action type="Redirect" url="/site1/{R:1}" appendQueryString="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
What could be a correct solution?
I think you could use the inverse of standard canonicalhostname redirect with some changes:
<rule name="CanonicalHostNameRule_Mod" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_HOST}" pattern="^www\.mySite1\.com$" />
</conditions>
<action type="Redirect" url="http://www.myMainDomain.com/site1/{R:1}" />
</rule>
In this way you have to make a rule for each secondary domain.

Editing configSource file at runtime

I want to edit a web application's config at runtime, specifically the file that is referenced by a configSource attribute. Whenever I try to open the file using the WebConfigurationManager, I always get the web.config, not rewrite.config.
Once I get it open, I want to edit it (e.g. clear out existing entries, add new entries) and save it back out to rewrite.config.
Am I better off just reading it in as a file (e.g. System.IO)
web.config
<system.webServer>
<rewrite>
<rules configSource="rewrite.config" />
</rewrite>
rewrite.config
<rules>
<rule name="rewrite1" stopProcessing="true">
<match url="^contact-us.html$" />
<action type="Rewrite" url="/contact-us" />
</rule>
<rule name="rewrite2" stopProcessing="true">
<match url="^about-us.html$" />
<action type="Rewrite" url="/about-us" />
</rule>
</rules>

Custom ServerVariable IIS

i am trying to create a custom servervariable with url rewrite.
Url Rewrite for IIS generates the following config entry
<rewrite>
<rules>
<rule name="CName to URL - Rewrite" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="^(?!www)(.*)\.localfurnco\.de" />
</conditions>
<action type="Rewrite" url="?" appendQueryString="false" />
<serverVariables>
<set name="HTTP_MANUFACTURER" value="{C:1}" />
</serverVariables>
</rule>
</rules>
</rewrite>
But when iterating through the servervariables i can't find HTTP_MANUFACTURER.
The url rewrite seems to work but i can't get the Variable.
I am trying to call the address: test.localfurnco.de/subdir/webservice.asmx?wsdl.
C:1 should in this case be: "test".
I would be grateful for any suggestion and
thanks in advance
After trying some hours i figured it out myself.
Here is the resulting rule.
<rule name="CName to URL - Rewrite" stopProcessing="false">
<match url=".*" negate="false" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="true">
<add input="{SERVER_NAME}" pattern="^(?!www)(.*)\.localfurnco\.de" />
</conditions>
<action type="Rewrite" url="?CustomValue={C:1}" logRewrittenUrl="true" />
<serverVariables>
<set name="HTTP_MANUFACTURER" value="{C:1}" />
</serverVariables>
</rule>
With this rule it is possible to access the ServerVariable "HTTP_MANUFACTURER" from C#:
string variable= httpContext.Current.Request.ServerVariables.Get("HTTP_MANUFACTURER");
A Different option a friend shared with me is this:
string value= HttpContext.Current.Request.Params.Get("CustomValue");
As you can see i rewrite the url and set a parameter which i assign the, by the pattern, filtered value.
I hope this helps somebody else.

Redirect website from http to https

I have a website stored on azure for which I got an SSL certificate. I am trying to redirect www.mywebsite.com to https://www.mywebsite.com but with no success.
I am using the following code that should change the configuration of IIS where my project is deployed :
<system.webServer>
<rewrite>
<rules>
<rule name="Redirect to HTTPS">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
<add input="{URL}" pattern="/$" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Redirect" url="https://{SERVER_NAME}/{R:1}" redirectType="SeeOther" />
</rule>
</rules>
</rewrite>
But when I type my URL it does not redirect to https.
By the way, rewrite appears unrecorgnized by Intellisense.
I can see that you've taken the code snipet from Steve Marx example
The problem is that you have whitespace in your rule name. Just remove them and it will work.
The name attribute of rule must not have spaces; the rule won’t work correctly in IIS on Azure with spaces in the name.
Find the full article here:
Azure https guide

Categories