该页面是布局页面(_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" />
这里是整个项目(或主要部分没有无用的代码)。
_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
答案 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了解更多详情。
相关问题: