我以前从未见过 实际使用过的<base>
HTML标签.它的使用存在缺陷,这意味着我应该避免它吗?
事实上我从来没有注意到它在现代生产网站(或任何网站)上的使用让我对它持怀疑态度,尽管看起来它可能有用于简化我网站链接的有用应用程序.
使用基本标签几周后,我最终找到了使用基本标签的一些主要问题,这使得它比最初出现时更不可取.从本质上讲,变化href='#topic'
和href=''
基本标签下是非常有它们的默认行为不兼容,并可以从默认行为,这种变化很容易使第三方库的控制范围之外的非常不可靠的 以意想不到的方式,因为它们在逻辑上依赖于默认行为.通常,这些更改是微妙的,并且在处理大型代码库时会导致不那么明显的问题.我已经创建了一个回答,详细说明了我在下面遇到的问题.因此,在您进行广泛部署之前,请自行测试链接结果<base>
,这是我的新建议!
我有非SPA服务器端应用程序与React应用程序,仅限于当前页面,/some/static/page
.应用程序<base href="/">
在<head>
所有页面上都依赖于它,这是无法更改的.
以下是React 16,React Router 4的基本示例<HashRouter>
:
export class App extends React.Component {
render() {
return (
<HashRouter>
<div>
<Route exact path="/" component={Root} />
</div>
</HashRouter>
);
}
}
Run Code Online (Sandbox Code Playgroud)
可以禁用所有路由以进行测试,但这不会更改行为.
这是create-react-app
显示问题的项目.复制它的步骤是:
npm i
npm start
http://localhost:3000/some/static/page
HashRouter显然受到影响<base>
.它重定向/some/static/page
到/#/
初始化,而我期望它是/some/static/page#/
或/some/static/page/#/
(只在IE 11中工作).
Root
组件在重定向之前会快速启动/#/
.
它重定向到/foo/#/
的情况下<base href="/foo">
,并重定向到/some/static/page/#/
当<base>
标签被删除.
问题影响Chrome和Firefox(最新版本),但不影响Internet Explorer(IE 11).
为什么<HashRouter> …
当使用链接进行javascript操作时,我通常会这样做:
<a href="#">Link Text</a>
Run Code Online (Sandbox Code Playgroud)
这样,当有人在页面加载之前点击链接时,没有任何可怕的事情发生.
在我当前的项目中,我使用相同的构造,但使用基本标记:
<html>
<head>
<base href="http://example.com/" />
</head>
<body>
<a href="#">Link Text</a>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
但是,如果页面网址是:
http://example.com/dir/page
Run Code Online (Sandbox Code Playgroud)
单击链接导航到
http://example.com/#
Run Code Online (Sandbox Code Playgroud)
而不是
http://example.com/dir/page#
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
摘要:
使用时<base href="/prod/public/" />
,它会在路由URL中添加目录路径e.x.
http://www.example.com/prod/public/home
我的角度应用程序托管在prod/public
目录中.
在我的public/index.html
:
<base href="/prod/public/" />
Run Code Online (Sandbox Code Playgroud)
我的路线是这样的:
$stateProvider
.state('home', {
url: '/home',
templateUrl: function($stateParams) {
var path = 'app/users/views/home.html';
return path;
},
controller: 'HomeCtrl'
})
Run Code Online (Sandbox Code Playgroud)
目录结构:
public_html
-.htaccess
- other folders
- prod
- public
- app
- index.html
- bower.json
- .htaccess
- package.json
- gulpfile.js
- Readme.md
Run Code Online (Sandbox Code Playgroud)
.htaccess
内部prod
目录:
RewriteEngine On
Options -Indexes
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond …
Run Code Online (Sandbox Code Playgroud) 在Chrome上我Refused to execute a JavaScript script. Source code of script found within request.
发布包含域名的数据后发现错误(另请注意,任何一个页面都缺少javascript).
<form action="/badpage2.html" method="post">
<input type="hidden" name="name" value="href=%22http://www.w3.org/%22"/>
<input type="submit" name="submit"/>
</form>
Run Code Online (Sandbox Code Playgroud)
<!DOCTYPE html>
<html>
<head>
<base href="http://www.w3.org/"/>
</head>
<body>
<img src="Icons/w3c_home" alt="">
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
如果你直接去badpage2.html
图像会显示,但如果你去看它badpage1.html
,图像将不会显示(基本标签不起作用).
这是Chrome XSS检测中的错误吗?如果不是,我该如何绕过这个?对发布的数据进行编码只是为了绕过这个过滤器似乎很愚蠢.
编辑:
就我而言,发送的帖子值是更新页面内容的一部分.如果它包含恰好包含在其中使用的域名<base>
(如本例所示),它将触发禁用<base>
标记的XSS检测.
请帮助我理解<base>
标签的 href 属性的功能。
我有一个网站托管在http://goodsite.org/bob
. 其他网站托管在http://goodsite.org/others
.
我打算将我的应用程序移至http://bettersite.org/bob
.
为了支持这一点,我的标题中有一个基本网址。
<base href="/bob/">
.
我的链接看起来像这样: <a href="thatonething.img">That one thing</a>
正如所希望的那样,我看到了预期的链接(例如"http://goodsite.org/bob/thatonething.img"
)
题:
<base>
标签是否普遍支持根相对网址(即href="/bob/"
)?
这似乎在我的测试中有效,但我在阅读规范时遇到了一些麻烦。更一般地说,我想知道我是否滥用了这个标签。
base-tag ×6
html ×4
javascript ×2
.htaccess ×1
angularjs ×1
base-url ×1
contextpath ×1
hash ×1
post ×1
react-router ×1
reactjs ×1
redirect ×1
ui-sref ×1
xss ×1