无法使用前导..退出顶级目录(带代字号)

时间:2017-09-17 19:15:49

标签: vb.net razor url-rewriting

错误

  

该页面是布局页面(_layout.vbhtml)

     

- 错误说明:

     

无法使用前导..退出顶级目录。

     

- 来源错误:

Line 70: WriteLiteral(" rel=""stylesheet""")
Line 71: 
Line 72: WriteAttribute("href", Tuple.Create(" href=""", 534),     Tuple.Create("""", 591) _
Line 73: , Tuple.Create(Tuple.Create("", 541), Tuple.Create(Of System.Object, System.Int32)(Href("~/frameworks/uikit-3.0.0-beta.30/css/uikit.min.css") _
Line 74: , 541), False) _

仅当我删除所有使用波浪号声明的js / css引用时才有效。

<link rel="stylesheet" href="~/frameworks/uikit-3.0.0-beta.30/css/uikit.min.css"/>

或者

<script src="~/frameworks/jquery/jquery-3.2.1.min.js"></script>

不起作用,但这项工作:

<script src="/frameworks/jquery/jquery-3.2.1.min.js"></script>

配置

我的网站配置有点复杂。

Root
  ├── bin
  ├── some other folders
  ├── folder-of-mydomain-com (sub application)
  │   ├── bin
  │   ├── frameworks
  │   │      └── uikit-3.0.0-beta.30
  │   │             └── css
  │   │                  └── uikit.min.css
  │   ├── some other folders
  │   ├── template
  │   │   ├── style.css
  │   │   ├── _layout.vbhtml
  │   │   └── index.vbhtml
  │   │
  │   ├── global.asax           ***
  |   └── [sub]web.config       **
  |
  └── [root]web.config          *

* [root]web.config文件包含这样的重写规则:

  

mydomain.com的所有请求都会重写为folder-of-domain-com

<action type="Rewrite" url="folder-of-mydomain-com/{R:1}" />

** [sub]web.config文件包含:

  

<rewrite> <rules> <clear/> ...

***global.asax中有一个RewritePath:

If LCase(Request.Url.AbsolutePath) = "/folder-of-mydomain-com/index.html" Then
    newPath = "~/template/index.vbhtml"
End If

所以...

指向根工作的主域(maindomain.com)!

maindomain.com/folder-of-mydomain-com/index.html

为什么mydomain.com/index.html带'〜/'会给我这个错误?是IIS配置的问题?应该参考子应用程序的根目录。

更新

在Razor布局中使用波浪号的所有链接都会给我这个错误。这是一个简单的图像:

<img src="~/template/img/img_01.jpg" />

更新2

这里是整个项目(或主要部分没有无用的代码)。

_layout.vbhtml

<!DOCTYPE html>
<html>
    <head>
        <title>@*@Page.Title*@</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <script src="~/frameworks/jquery/jquery-3.2.1.min.js"></script>
    </head>
    <body>
        @RenderBody()
    </body>
</html>

index.vbhtml

@Code
    PageData("Title") = "My title"
    Layout = "_layout.vbhtml"
End Code

<div>
    <p>My home page</p>
</div>

[根]的web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
        <compilation debug="true" targetFramework="4.5.2" />
        <httpRuntime targetFramework="4.5.2" />
    </system.web>
  <system.webServer>
    <directoryBrowse enabled="false"/>
    <rewrite>
      <rules>
        <clear/>
        <rule name="MyRule" stopProcessing="true">
          <match url="(.*)" ignoreCase="true" />
          <conditions logicalGrouping="MatchAll">
            <add input="{HTTP_HOST}" pattern="^(www\.)?mydomain\.com$" ignoreCase="false" />
          </conditions>
          <action type="Rewrite" url="folder-of-mydomain-com/{R:1}" />
        </rule>
      </rules>
    </rewrite>
    <handlers>
      <add name="HTML Handler" path="*.html" verb="*" type="System.Web.UI.PageHandlerFactory" resourceType="Unspecified"/>
    </handlers>
  </system.webServer>
</configuration>

[子]的web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <compilation strict="false" explicit="true" targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2" />
    <trust level="Full" />
  </system.web>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <system.webServer>
    <rewrite>
      <rules>
        <clear />
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

global.asax(在子应用上)

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)

    If LCase(Request.Url.AbsolutePath) = "/folder-of-mydomain-com/index.html" Then
        HttpContext.Current.RewritePath("~/template/index.vbhtml")
    End If

    If LCase(Request.Url.AbsolutePath) = "/folder-of-mydomain-com/template/index.html" Then
        HttpContext.Current.RewritePath("~/template/index.vbhtml")
    End If

End Sub

一些例子:

这些工作

  

maindomain.com/folder-of-mydomain-com/index.html

     

maindomain.com/folder-of-mydomain-com/template/index.html

     

maindomain.com/folder-of-mydomain-com/template/index.vbhtml

     

mydomain.com/template/index.html

     

mydomain.com/template/index.vbhtml

     

maindomain.com/folder-of-mydomain-com/template/index.vbhtml

这不起作用(已知错误)

  

mydomain.com/index.html

解决方案

https://stackoverflow.com/a/23302191/4031083

从上面的答案:

  

Url Rewrite和Tilde(〜)

     

升级到ASP.NET Razor 3或ASP.NET MVC 5之后,代字号(〜)   如果您使用URL重写,表示法可能无法正常工作。   URL重写会影响HTML元素中的波浪号(〜)表示法,例如   <A/><SCRIPT/><LINK/>,因此代字号不再映射到   根目录。

     

例如,如果您将 asp.net/content 的请求重写为 asp.net ,   中的href属性   <A href="~/content/"/>已解决    / content / content / 而不是 / 。要禁止此更改,您可以设置   每个网页或中的 IIS_WasUrlRewritten 上下文为false   Global.asax中的 Application_BeginRequest

代码

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
        Request.ServerVariables.Remove("IIS_WasUrlRewritten")
End sub

1 个答案:

答案 0 :(得分:1)

无法使用前导..退出顶级目录错误通常表示请求指向当前页面上一级的文件夹,并且因为您的脚本资源放在了应用程序子上-folder,这可能表示应用程序根实际使用了父文件夹(maindomain)而不是子文件夹(folder-of-mydomain-com)。

ASP.NET Web Project Paths表示使用代字号(~):

  

为了克服这些缺点,ASP.NET包含Web应用程序   root运算符(〜),可在指定路径时使用。 ASP.NET将〜运算符解析为当前的根   应用。您可以将〜运算符与文件夹结合使用   指定基于当前根目录的路径。

因此可归纳如下:

  

~/frameworks/jquery/jquery-3.2.1.min.js =&gt;指应用程序根路径 - 根级别不存在可能的目录结构

     

/frameworks/jquery/jquery-3.2.1.min.js =&gt;指站点根路径 - 此目录结构存在

实际问题可能在于应用程序root的web.config中当前的URL重写模式。应该像这个示例一样使用URL重写(注意match元素中的正则表达式会影响浏览器中用户提交的URL,并且url根据整个站点根目录分配给绝对路径:

<system.webServer>
    <rewrite>
      <rules>
        <clear/>
        <rule name="MyRule" stopProcessing="true">
          <match url="(.*)" ignoreCase="true" />
          <conditions logicalGrouping="MatchAll">
            <add input="{HTTP_HOST}" pattern="^(mydomain\.com|www\.mydomain\.com)$" ignoreCase="false" />
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
          </conditions>
          <action type="Rewrite" url="http://maindomain.com/folder-of-mydomain-com/{R:1}" />
        </rule>
      </rules>
    </rewrite>
</system.webServer>

根据您的需要,上述示例中提供的Rewrite可能会更改为Redirect规则,并在必要时在redirectType="Temporary"元素上添加action

<action type="Redirect" url="http://maindomain.com/folder-of-mydomain-com/{R:1}" redirectType="Temporary" />

您还可以查看IIS URL Rewrite Module Configuration Reference了解更多详情。

相关问题:

slash(/) vs tilde slash (~/) in style sheet path in asp.net

IIS7 URL Redirection from root to sub directory