iis url rewrite user-friendly urls multiple rules conflict and not wokrs - mod-rewrite

I've been trying to create user-friendly urls but multiple rules seems to conflict.
I need to create it like:
www.example.com/destination/abc
www.example.com/river/cde
With this code:
<rules>
<rule name="RedirectUserFriendlyURL3" stopProcessing="true">
<match url="^destination\.php$" />
<conditions>
<add input="{REQUEST_METHOD}" pattern="^POST$" negate="true" />
<add input="{QUERY_STRING}" pattern="^([^=&]+)=([^=&]+)$" />
</conditions>
<action type="Redirect" url="{C:1}/{C:2}" appendQueryString="false" />
</rule>
<rule name="RewriteUserFriendlyURL3" stopProcessing="true">
<match url="^([^/]+)/([^/]+)/?$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="destination.php?{R:1}={R:2}" />
</rule>
<rule name="RedirectUserFriendlyURL4" stopProcessing="true">
<match url="^river\.php$" />
<conditions>
<add input="{REQUEST_METHOD}" pattern="^POST$" negate="true" />
<add input="{QUERY_STRING}" pattern="^([^=&]+)=([^=&]+)$" />
</conditions>
<action type="Redirect" url="{C:1}/{C:2}" appendQueryString="false" />
</rule>
<rule name="RewriteUserFriendlyURL4" stopProcessing="true">
<match url="^([^/]+)/([^/]+)/?$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="river.php?{R:1}={R:2}" />
</rule>
</rules>
The rules above do not work together and both pages redirect to the one that's set in the first rule. So I get the error that $var is undefined and get no result on page, but the url is different.
I get this result I need
www.example.com/destination/abc
www.example.com/river/cde
But somehow it seems to redirect just in 1 rule.
Please any feedback, I checked many same posts but could find a solution

If your query is same with your php filename e.g
river.php?river=abc and destination.php?destination=abc
then you can change your code like this:
<action type="Rewrite" url="{R:1}.php?{R:1}={R:2}" />
So your filename should be same with query_string in url to work

Related

www IIS rewrite not respecting localhost

I googled this to death and read all the entries on StackOverflow with no luck. The following rewrite rule is not being respected in my local development environment.
<rule name="WWW-Rewrite" enabled="true" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="true">
<add input="{HTTP_HOST}" negate="true" pattern="^www\.(.*)$" />
<add input="{HTTP_HOST}" negate="true" pattern="ft-ue-firstsav-com" />
<add input="{HTTP_HOST}" matchType="Pattern" pattern="^localhost(:\d+)?$" negate="true" />
<add input="{HTTP_HOST}" matchType="Pattern" pattern="^127\.0\.0\.1(:\d+)?$" negate="true" />
</conditions>
<action type="Redirect" url="http://www.{HTTP_HOST}/{R:0}" appendQueryString="true" redirectType="Permanent" />
</rule>
To fix this I put in a slow cheetah transform flipping the enabled attribute from true to false in Debug mode. While this works I want the actual rule to work.
Any suggestons?

Why won't this URL Rewrite rule fire?

Rule is
<rule name="Redirect to new host" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{REQUEST_URI}" pattern=".*mycompany\.com/blogs(.*)" />
</conditions>
<action type="Redirect" url="http://blogs.mycompany.com{C:1}" />
</rule>
The module's built-in pattern tester says that http://subdomain.mycompany.com/blogs/blog1 matches, so it should redirect to http://blogs.mycompany.com/blog1, but nothing happens. Would greatly appreciate help fixing this rule or writing one that does work!
It's work:
<rule name="Test" stopProcessing="true">
<match url=".*" />
<conditions trackAllCaptures="true">
<add input="{HTTP_HOST}" pattern="^.*mycompany\.com$" />
<add input="{URL}" pattern="^/blogs(.*)$" />
</conditions>
<action type="Redirect" url="http://blogs.mycompany.com{C:1}" />
</rule>

Web.config URL Rewrite specific match URL

I have the following web.config URL Rewrite rule:
<rule name="RedirectUserFriendlyURL1" stopProcessing="true">
<match url="^propertysearch\.asp$" />
<conditions>
<add input="{REQUEST_METHOD}" pattern="^POST$" negate="true" />
<add input="{QUERY_STRING}" pattern="^urlrewrite=([^=&]+)$" />
</conditions>
<action type="Redirect" url="{C:1}" appendQueryString="false" />
</rule>
<rule name="RewriteUserFriendlyURL1" stopProcessing="true">
<match url="^([^/]+)/?$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="propertysearch.asp?urlrewrite={R:1}" />
</rule>
The problem is it is applying this to everything so what I want to do is change the match url syntax to tell it to ONLY run when "-to-rent-in-" is included in the URL, so...
www.domain.com/villas-to-rent-in-florida
WILL qualify and have the rule applied, BUT this wouldn't
www.domain.com/testentry
I have tried different variants but it keeps hitting an error :(
To get the url to trigger the rewrite only when -to-rent-in- is part of the first portion of the url, you could use:
<rule name="RewriteUserFriendlyURL1" stopProcessing="true">
<match url="^(.+-to-rent-in-.+)/?$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="propertysearch.asp?urlrewrite={R:1}" />
</rule>
url="^(.+-to-rent-in-.+)/?$" will match any url containing at least one character before -to-rent-in- and at least one after.
You don't want to limit the character(s) before or after to be only alphanumeric since your url can be like: www.domain.com/apartments-to-rent-in-new-york (where new-york contains a -)

IIS Rewrite Rule how to check requesturl + .php file is exists or not in rule

i want to check that file with requestedurl + .php is exists or not.
in apache i can do this with RewriteCond %{REQUEST_FILENAME}.php -f
so that it can rewrite my request test.com/login to test.com/login.php
i want to do same with iis rewrite rule.
i have tried with following.
<rewrite>
<rules>
<rule name="Imported Rule 1" stopProcessing="true">
<match url="^(.*)$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{REQUEST_FILENAME}\.php" matchType="IsFile" />
</conditions>
<action type="Rewrite" url="{R:1}.php" />
</rule>
<rule name="Imported Rule 2">
<match url="^(.*)$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="allpages.php" />
</rule>
</rules>
</rewrite>
but it doesnt works.
thanks in advance for help
Change {REQUEST_FILENAME}\.php to {REQUEST_FILENAME}.php in first rule.
Further there is no need to check if requested URL exists as directory.
To rewrite 'test.com/login' to 'test.com/login.php' only if login.php exits, use:
<rule name="Rewrite to PHP">
<match url="^(.*)$" />
<conditions>
<add input="{REQUEST_FILENAME}.php" matchType="IsFile" />
</conditions>
<action type="Rewrite" url="{R:0}.php" />
</rule>
Tested

wildcard redirect with url rewrite by web.config

I'm using the url rewrite features in web.config to redirect my subdomains. Here is my rule :
<rule name="redirect_page">
<match url=".*" ignoreCase="false" negate="false" />
<conditions>
<add input="{HTTP_HOST}" pattern="^www\." negate="true" />
<add input="{HTTP_HOST}" pattern="^([\w\-]+)\.mySite\.com$" />
</conditions>
<action type="Rewrite" url="profile.aspx?name={C:1}" />
</rule>
This works great :
http://myUser.mySite.com redirect to http://myUser.mySite.com/profile.aspx?name=myUser
BUT
http://myUser.mySite.com/image/myImage.jpg redirect to http://myUser.mySite.com/profile.aspx?name=myUser
=> What I want :
http://myUser.mySite.com/image/myImage.jpg redirect to http://myUser.mySite.com/image/myImage.jpg
Any idea ?
Well this is a little tricky but here is the solution :
<rule name="SubDomainDoNothing" stopProcessing="true">
<match url="(.+)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^(?!www)(\w+)\.plugandtable\.com$" />
</conditions>
<action type="Rewrite" url="{R:1}" />
</rule>
<rule name="SubDomainRedirect" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^(?!www)(\w+)\.plugandtable\.com$" />
</conditions>
<action type="Rewrite" url="profile.aspx?name={C:1}" />
</rule>

Resources