如何在锚中指定协议并仍然使用相对路径?

时间:2013-06-11 23:43:42

标签: http https uri anchor href

在个人网站上总是首选使用锚点中的​​相对路径,以便您可以轻松地将目录结构移动到新网站,但我想让我的网站密码受到保护(使用.htaccess),因此使用HTTPS。锚点href中是否有一种方法可以指定不同的协议而不用www.domain.com进行硬编码?

示例:

<a href="/student/example">Link</a>

我想把它变成像:

<a href="https: /student/example">Link</a>

以上显然不起作用。有什么办法吗?我试图避免任何脚本,但会比PHP或ASP更喜欢JavaScript。

4 个答案:

答案 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页面