【问题标题】:web.config redirection ignored on a shared hosting在共享主机上忽略 web.config 重定向
【发布时间】:2018-02-19 07:14:26
【问题描述】:

我有一个托管在共享 Microsoft-IIS/8.5 服务器上的网页。 我没有该服务器的管理员权限,也无权访问它的配置文件,所以我无法确定URL rewrite 模块或HTTP redirect 元素是否正确安装/设置.

我想建立一个从名为 old_folder 的文件夹到名为 new_folder 的文件夹的重定向(对我来说都是根目录,即 http://sharedhosting.com/myusername/)。 我在根文件夹下放了以下web.config文件:

<?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>

但我能得到的只是403 - Forbidden: Access is denied.(如果我留下一个空的old_folder)或404 - File or directory not found.(如果我删除它)。

我尝试使用HTTP Redirect,通过在old_folder 中放置一个包含Web.config 的文件

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

但这也没有用。

我知道我的 Web.config 文件已被读取(如果其中有错误,我会收到 500 个错误)。我怀疑安装了 URL 重写,因为例如,如果存在 folder 文件夹,http://sharedhosting.com/myusername/folder 将被重写为 http://sharedhosting.com/myusername/folder/(即带有斜线)。

我的规则正确吗?我的主机是否阻止我重定向?如果是,我怎么知道?

我在&lt;rules&gt; 标记后添加了&lt;clear /&gt; 以丢弃所有其他重写规则,但它仍然没有重定向任何内容。

我错过了什么?

赏金到期前的最后编辑 为了澄清,我的问题是“如何理解为什么服务器没有正确解释/忽略我的指令?”。

We came to the conclusion 可能是我的服务器设置得很奇怪,我正试图对其进行“还原工程”并检测是什么让服务器忽略了重定向/重写规则。

【问题讨论】:

    标签: asp.net redirect iis web-config url-rewrite-module


    【解决方案1】:

    您可以通过使用HttpHandlers 来实现相同的目的,所以我假设您可以直接在浏览器中访问Old_folderNew_folder

    这是一个示例httphandlers,你可以这样做:

    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; }
         } 
       }
    }
    

    web_config 中添加如下处理程序:

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

    使用 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>
    

    【讨论】:

    • @Clément 用你的尝试更新你的问题......它很难在 cmets 中阅读
    • @Clément 我提供了两种解决方案,一种使用IIS url 重写另一种使用http handlers
    • 很抱歉,我完全不知道如何使用httphandlers。我不熟悉asp.net,所以我正在尝试测试,但我什至无法判断您涉及httphandlers 的解决方案是否有效。正如我所说,涉及web.config 的解决方案不起作用,我很积极。非常感谢您的帮助,非常感谢。
    • @Clément,啊,np,会尽力帮助你..首先请告诉我你的asp.net框架,是4.6还是4.5,你会知道的您的 webconfig 中的版本号
    • 谢谢。再说一次,我不是root,所以我能做的就是尝试看看。我创建了一个带有&lt;%= System.Environment.Version.ToString() %&gt; .aspx 文件,并将其上传(我知道该文件已正确上传),但是当我尝试从浏览器访问它时,我收到404.0 错误。是否存在限制访问.aspx 文件的过滤器或模块?
    【解决方案2】:

    我认为这可以通过一个简单的重写规则来完成。

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

    上述规则会将所有请求发送到新文件夹,但保留带有old_folder 的旧网址。如果您希望 url 在其中将其显示更改为 new_folder,请使用

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

    在我的本地机器上使用文件夹、子文件夹和带有 QueryString 的请求对其进行了测试。我希望这也适用于共享主机。

    【讨论】:

    • 谢谢。我同意您的重写规则是正确的并且应该可以完成这项工作,但是在此服务器上,重定向不起作用。我的问题是“我的规则正确吗?我的主机是否阻止我重定向?如果是,我怎么知道?”您的规则也是正确的,但这无助于我理解为什么这些规则不适用。
    • 共享主机的名称是什么?它是免费帐户吗?共享主机通常意味着同一台服务器,而不是 IIS 域中的同一文件夹。
    • 它属于一个学院,我有一个账号,http://sharedhosting.com/myusername/类型的子文件夹。
    • 啊,没办法测试自己 :( 但是如果你试试 ^username/old_folder/ > username/new_folder/{R:1}?也许这会奏效...
    • 不错的尝试,但没有;-)
    猜你喜欢
    • 2010-11-23
    • 2013-07-03
    • 1970-01-01
    • 2011-03-27
    • 2016-01-01
    • 2016-02-24
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多