8

在个人网站上始终首选在锚点中使用相对路径,以便您可以轻松地将目录结构移动到新网站,但我想让我的网站的一部分密码受到保护(使用 .htaccess)并因此使用 https。有没有办法在锚的href中指定不同的协议而不用硬编码www.domain.com

例子:

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

我想把它变成这样的东西:

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

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

4

4 回答 4

2

我认为没有“简单”的解决方案......而且 javascript 对于这样的目的似乎不是一个好主意。

你可以试试:

<base href="https://yourdomain.com/">

放置在文档标题中。

或者

你的想法:

<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>
于 2013-06-12T01:09:13.897 回答
2

如果不依赖 Javascript 动态更改 href,您将无法做到这一点。RFC 3986 第 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是相对 URL 并且T是目标。

上面基本上是说如果在相对URI中指定了scheme,那么目标uri将是整个相对uri,所以指定scheme的唯一方法就是指定整个url。

如果您想使用基于 Javascript 的方法,您可以使用以下内容动态设置 href a.href = 'https://' + window.location.host + a.getAttribute('href'):. a你的 AnchorElement在哪里。

这是 Javascript 版本的演示:http: //jsfiddle.net/7DWV5/

但是,很大程度上由于您遇到的原因,最好将您的主机名存储在配置文件中,或者从Host前端控制器中的 HTTP 请求标头中检测它。这样您就可以在生成页面时将其模板化到您的 HTML 中。这使您不必在生成 url 后使用客户端脚本来修复它们,这可能是可取的,因为并非每个人都启用了 Javascript。

于 2013-06-12T00:14:17.850 回答
0

您还应该使用 .htaccess 将 https 添加到您网站的特定 URL。确保您的 .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

于 2013-06-12T00:16:49.257 回答
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 页面

于 2013-06-12T00:41:44.640 回答