2013-06-11 3 views
7

На личном веб-сайте всегда рекомендуется использовать относительные пути в якорях, чтобы вы могли легко перемещать структуру каталогов на новый веб-сайт, но я хочу сделать часть своего пароля защищенной паролем (используя .htaccess) и, следовательно, использовать https , Есть ли способ в href привязки указать другой протокол без жесткого кодирования www.domain.com?Как указать протокол в привязке и использовать относительный путь?

Пример:

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

Я хочу, чтобы превратить его в нечто вроде:

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

выше, очевидно, не работает. Есть ли способ сделать это? Я стараюсь избегать любых сценариев, но буду ценить JavaScript больше, чем PHP или ASP.

+0

Добро пожаловать в StackOverflow. Это хороший вопрос. – Paulpro

ответ

0

Вы не можете сделать это, не полагаясь на Javascript для динамического изменения href. Образом относительные идентификаторы URI преобразуются в абсолютной URI, описан в RFC 3986 Section 5.2.2:

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, то целевым 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.

0

Вы должны добавить https к определенным URL-адресам вашего сайта, используя также .htaccess. Убедитесь, что файл .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

+0

Это добавит дополнительный HTTP-запрос и не будет работать, и конкретный ресурс сможет обслуживаться как HTTP, так и HTTPS (он предотвращает доступ к ресурсу через HTTP). Если доступ к ресурсу должен выполняться только через HTTPS, то требуется что-то вроде выше, которое блокирует доступ через HTTP. – Paulpro

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, в первую очередь

1

Я думаю, что нет «простого» решения ... И, похоже, 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> 

и в нижней части, но перед закрытием тела тег место что-то вроде этого:

<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> 
+0

Опять же, javascript не является хорошей идеей для таких целей. (может быть в основном отключен или не поддерживается и т. Д.). @Paulpro прав, лучше сделать вашу серверную страницу https. – Chris

+1

Другая идея - использовать относительный URL-адрес протокола в базовом теге. – Chris