Add POST body with IIS web.config rewrite - iis

I'm using IIS as a reverse proxy to avoid CORS issues for data fetching. I'd like to store auth data (client id and secret) in the web.config and create a request body that gets included with the matching request. Is this possible? If not, is it possible to add that info to a header?
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
...
<rule name="proxyRule" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="http://dataserver/{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

Related

Node App with IIS ARR Proxy Not Handling URLs Properly

I have a node/express app that has special URL characters in it's route. For example, the route would be /urlinspect/https://example.com
This works without issue when I run it locally but when I attempt to run it through IIS with ARR/Reverse Proxy it fails to handle the URL properly. I had already added the useOriginalURLEncoding="false" to my Web.config and set the useOriginalURLEncoding to false in both the system.webServer/rewrite/rules and system.webServer/rewrite/globalrules paths of configuration within IIS.
<configuration>
<system.webServer>
<rewrite>
<rules useOriginalURLEncoding="false">
<rule name="ReverseProxyInboundRule1" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="http://localhost:3000/{R:1}" />
</rule>
</rules>
</rewrite>
<security>
<requestFiltering allowDoubleEscaping="false" />
</security>
</system.webServer>
</configuration>

IIS reverse proxy add Authorization header

I have set up Application Request Routing in IIS 8.5 for reverse proxy.
Proxy is working but I have to pass additional Authorization header to the site behind the proxy so it can authorize automatically. Problem is that it does not add the header. Is there something wrong with the configuration?
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<allowedServerVariables>
<add name="HTTP_AUTHORIZATION" />
</allowedServerVariables>
<rules>
<rule name="ReverseProxyInboundRule1" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="http://https://my.test.service.url.com/{R:1}" />
<serverVariables>
<set name="HTTP_AUTHORIZATION" value="Bearer token12345=" />
</serverVariables>
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

(413) Request Entity Too Large in IIS 10 URL Rewrite

I have an IIS 10 server configured as a basic URL Rewrite reverse proxy to preauthenticate requests directed at another web server, the calls are all presenting client certificates over SSL. I'm having issues with (413) Request Entity Too Large errors with large POSTs.
I've tried setting this in applicationHost.config
<serverRuntime uploadReadAheadSize="2147483647" />
However this had no effect. Are there any other settings that control URL Rewrite's rejection of large POSTs?
The web.config for the reverse proxy is very simple:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="ReverseProxyInboundRule1" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{CACHE_URL}" pattern="^(https?)://" />
</conditions>
<action type="Rewrite" url="{C:1}://my.internal.server:444/{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
To sum up from the comment.
Try changing <httpRuntime maxRequestLength="4194304" /> first.
If it doesn't work try <requestLimits maxAllowedContentLength="2147483647" /> next.
If it stills doesn't work leave me a comment.
Normal setting for max upload file size:
Setting the request limits in the root web.config of the site (default is 30 MB). This can be set in Internet Information Services Manager Program also (MACHINE->Site->IIS->Request Filtering->Edit Feature Settings)
<!– 100 MB . Format uses Bytes –>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength=”102400000″ />
</requestFiltering>
</security>

Azure Server error when port appended to host header

I'm running an Azure Web App that's meant to accept XML Posts. When I post to the urls using cURL everything works, however, when using Apache Camel/HTTP the POST results in a 400 error. When I look at the log files, the only difference is cs-host field. For the cURL commands the value is just the domain (e.g. azurewebsites.net), however the Apache POST appends port 80 (e.g. azurewebsites.net:80). I added a rewrite rule that would strip the port from the call (rule details below), but the POST still results in 400 error. The closest related post I could find was here: Including Port number in HTTP HOST header causes Service Unavailable error but unfortunately it looks like it's related to Netscaler, not Azure Web App, and the resolution didn't provide any detailed guidance.. Thanks for any input!
Here's the rewrite rule:
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<location path="domain" xdt:Locator="Match(path)">
<system.webServer>
<rewrite xdt:Transform="InsertBefore(/configuration/location[(#path='domain')]/system.webServer/*[1])">
<rules>
<rule name="domainrule1" stopProcessing="true">
<match url="domain.azurewebsites.net:80(.*)" />
<action type="Redirect" url="http://domain.azurewebsites.net/{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</location>
<location path="~1domain" xdt:Locator="Match(path)">
<system.webServer>
<rewrite>
<rules>
<rule name="domainrule2" stopProcessing="true" xdt:Transform="Insert">
<match url="domain.azurewebsites.net:80(.*)" />
<action type="Redirect" url="http://domain.azurewebsites.net/{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</location>
</configuration>

web.config rewrite from one directory to another

I'm struggling to transform an Apache .htaccess rewrite to an IIS rewrite. I would like to rewrite from one directory to another.
Example: If someone accesses the URI: /booklets/MyPDF.pdf then the rewrite would access the file using /res/pdf/MyPDF.pdf
This is what I have so far:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Rewrite for booklets location" enabled="true">
<match url="^booklets/(.*).pdf" />
<action type="Rewrite" url="res/pdf/{R:1}.pdf" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Any help would be greatly appreciated.
In addition to your own answer i would suggest you to add stopProcessing attribute and backslash dot symbol before extension in regular expression:
<rule name="Rewrite for booklets location" stopProcessing="true">
<match url="^booklets/(.*)\.pdf$" ignoreCase="true"/>
<action type="Rewrite" url="res/pdf/{R:1}.pdf"/>
</rule>
After tinkering around with it, I just removed enabled="true" from the rule and added the ending regex $ to the url match, and now it works!
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Rewrite for booklets location">
<match url="^booklets/(.*).pdf$" />
<action type="Rewrite" url="res/pdf/{R:1}.pdf" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

Resources