简体   繁体   中英

web.config redirection ignored on a shared hosting

I have a webpage hosted on a shared Microsoft-IIS/8.5 server. I don't have the admin privileges on that server, and I don't have access to its configuration files, so I can't really make sure that the URL rewrite module or the HTTP redirect element are correctly installed / set up.

I would like to establish a redirection from a folder named old_folder to a folder named new_folder (both at the root for me, ie, at http://sharedhosting.com/myusername/ ). I placed in the root folder the following web.config file:

<?xml version="1.0" encoding="UTF-8"?>

<configuration>
    <configSections>
        <sectionGroup name="system.webServer">
            <sectionGroup name="rewrite">
                <section name="rules" overrideModeDefault="Allow" />
            </sectionGroup>
        </sectionGroup>
    </configSections>

    <system.webServer>
        <rewrite>
            <rules>
                <rule name="attempt" stopProcessing="true" enabled="true">
                <match url="^old_folder/$" />
                <action type="Redirect" url="new_folder/" redirectType="Permanent"/>
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

But all I can get is a 403 - Forbidden: Access is denied. (if I leave an empty old_folder ) or a 404 - File or directory not found. (if I erase it).

I tried using the HTTP Redirect , by placing in old_folder a Web.config file containing

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.webServer>
        <httpRedirect enabled="true" destination="http://sharedhosting.com/myusername/new_folder/" />
    </system.webServer>
</configuration> 

But that didn't worked either.

I know that my Web.config files are read (I can get 500 errors if there is an error in them). I suspect that the URL rewrite is installed, since, for instance, http://sharedhosting.com/myusername/folder is rewritten to http://sharedhosting.com/myusername/folder/ (ie, with a slash) if the folder folder exists.

Is my rule correct? Does my host prevent me from redirecting? If yes, how can I tell?

I added a <clear /> after the <rules> tag to discard all the other rewriting rules, but it still isn't redirecting anything.

What am I missing?

LAST EDIT BEFORE THE BOUNTY EXPIRES To clarify, my question is "How to understand why the server isn't correctly interpreting / ignoring my instructions?".

We came to the conclusion that it was probably my server that was weirdly set-up, I'm precisely trying to "revert-engineer" that and to detect what's making the server ignore the redirect / rewrite rules.

You can achieve the same thing by using the HttpHandlers , so i'm presuming that you can access the both Old_folder and New_folder directly in the browser .

Here is a sample httphandlers , you can do in this way :

youname.Handlers
{
   public class RedirectHandler : IHttpHandler
  {
      public void ProcessRequest(HttpContext context)
     {
        context.Response.Status = "301 Moved Permanently";
        string url = context.Request.Url.ToString().Replace("old_folder", "new_folder");
        context.Response.AddHeader("Location", url);
      }
      public bool IsReusable
     {
        get { return false; }
     } 
   }
}

In web_config add the handler as follows:

system.web>
   <httpHandlers>
     <add verb="*" path="xxx/*.*" type="yourname.Handlers.RedirectHandler"/>
   </httpHandlers>
</system.web>

Using IIS Url_rewriting :

   <?xml version="1.0"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rewriteMaps>
                <rewriteMap name="yourRedirects">
                    <add key="/yourroot/old_folder/" value="/otherdir/new_folder" />
                </rewriteMap>
            </rewriteMaps>
            <rules>
                <rule name="RedirectRule" stopProcessing="true">
                    <match url=".*" />
                    <conditions>
                        <add input="{yourRedirects:{REQUEST_URI}}" pattern="(.+)" />
                    </conditions>
                    <action type="Redirect" url="http://www.yourdomain.com{C:1}" appendQueryString="False" redirectType="Permanent" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

I think this can be done with a simple rewrite rule.

<rule name="ToNewFolder" stopProcessing="true">
   <match url="^old_folder/(.*)" ignoreCase="true" />
   <action type="Rewrite" url="new_folder/{R:1}" />
</rule>

The above rule will send all requests to the new folder, but keeps the old url with old_folder in it. If you want the url to change it's display to new_folder in it, use

<rule name="ToNewFolder" stopProcessing="true">
   <match url="^old_folder/(.*)" ignoreCase="true" />
   <action type="Redirect" url="new_folder/{R:1}" />
</rule>

Tested it on my local machine with folders, subfolders an requests with a QueryString. I hope this works on shared hosting also.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM