在个人网站上总是首选使用锚点中的相对路径,以便您可以轻松地将目录结构移动到新网站,但我想让我的网站密码受到保护(使用.htaccess),因此使用HTTPS。锚点href中是否有一种方法可以指定不同的协议而不用对www.domain.com
进行硬编码?
示例:
<a href="/student/example">Link</a>
我想把它变成像:
<a href="https: /student/example">Link</a>
以上显然不起作用。有什么办法吗?我试图避免任何脚本,但会比PHP或ASP更喜欢JavaScript。
答案 0 :(得分:1)
如果不依赖Javascript动态更改href,则无法执行此操作。 RFC 3986 Section 5.2.2:
中描述了将相对URI转换为绝对URI的方式if defined(R.scheme) then
T.scheme = R.scheme;
T.authority = R.authority;
T.path = remove_dot_segments(R.path);
T.query = R.query;
else
if defined(R.authority) then
T.authority = R.authority;
T.path = remove_dot_segments(R.path);
T.query = R.query;
else
if (R.path == "") then
T.path = Base.path;
if defined(R.query) then
T.query = R.query;
else
T.query = Base.query;
endif;
else
if (R.path starts-with "/") then
T.path = remove_dot_segments(R.path);
else
T.path = merge(Base.path, R.path);
T.path = remove_dot_segments(T.path);
endif;
T.query = R.query;
endif;
T.authority = Base.authority;
endif;
T.scheme = Base.scheme;
endif;
T.fragment = R.fragment;
其中R
是相对网址,T
是目标。
以上基本上说如果在相对URI中指定了方案,那么目标uri将是整个相对uri,因此指定方案的唯一方法是指定整个url。
如果您想使用基于Javascript的方法,可以使用以下内容动态设置href:a.href = 'https://' + window.location.host + a.getAttribute('href')
。其中a
是您的AnchorElement。
以下是Javascript版本的演示: http://jsfiddle.net/7DWV5/
但是,主要是因为您遇到的原因,最好将主机名存储在配置文件中,或者从前端控制器的HTTP请求Host
标头中检测它。这样,您可以在生成页面时将其模板化为HTML。这样可以避免在生成后使用客户端脚本来修复您的URL,这可能是可取的,因为不是每个人都启用了Javascript。
答案 1 :(得分:1)
我认为没有“简单”的解决方案...... 对于这样的目的,javascript似乎是一个坏主意。
你可以尝试:
<base href="https://yourdomain.com/">
放在文件标题中。
OR
你的想法:
<a href="/test-me1/">regular link 1</a>
<a href="/test-me2/">regular link 2</a>
<a href="/https/test-me3/">secure link</a>
并在底部,但在关闭 body 标记之前,请执行以下操作:
<script type="text/javascript">
(function(){
var h = 'yourdomain.com';
/* could be replaced with something like window.location.host */
var a = document.links;
for (var c = 0; c < a.length; c++) {
var i = a[c].href.indexOf('/https/');
if(-1 !== i)
{
a[c].href = 'https://' + h + '/' + a[c].href.substring( i + 7 );
/* where 7 is a length of '/https/' */
}
}
})();
</script>
或者甚至简单地说:
<script type="text/javascript">
(function(){
var a = document.links;
for (var c = 0; c < a.length; c++) {
if(-1 !== a[c].href.indexOf('/https/') )
{
a[c].href = a[c].href.replace('/https/','').replace('http:','https:');
}
}
})();
</script>
答案 2 :(得分:0)
您也应该使用.htaccess将https添加到您网站的特定网址。确保您的.htaccess文件包含以下行:
RewriteEngine on
然后尝试在其后添加此行:
RewriteRule "^/student(/.*)" "https://%{HTTP_HOST}$1" [R=301,L]
http://www.askapache.com/htaccess/ssl-example-usage-in-htaccess.html#redirect-urls-to-ssl
答案 3 :(得分:0)
在JavaScript中,您可以执行以下操作:
<script>
function handleLink(a){
var path = a.getAttribute('href'),
host = location.hostname;
location.href = 'https://'+host+path;
return false;
}
</script>
<a href="/student/example" onclick="return handleLink(this)">Link</a>
我不会。 如果您热衷于让用户使用SSL,我首先会将页面重定向到SSL页面