2013-06-11 17 views
7

Zawsze preferuje się na osobistej stronie internetowej stosowanie względnych ścieżek w kotwach, aby można było łatwo przenieść strukturę katalogów do nowej witryny internetowej, ale chcę, aby część mojego hasła do witryny była chroniona (przy użyciu .htaccess), a zatem używać https . Czy jest jakiś sposób w hoście kotwicy, aby określić inny protokół bez kodowania twardego również www.domain.com?Jak określić protokół w kotwicy i nadal używać względnej ścieżki?

Przykład:

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

Chcę przekształcić go w coś takiego:

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

Powyższe oczywiście nie działa. Czy jest jakiś sposób to zrobić? Próbuję unikać skryptów, ale doceniłbym JavaScript bardziej niż PHP czy ASP.

+0

Witamy w StackOverflow. To dobre pytanie. – Paulpro

Odpowiedz

0

Nie można tego zrobić bez polegania na JavaScript, aby dynamicznie zmieniać href. Sposób względne URI są przekształcane w absolutnym URI opisano w 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; 

przypadku R jest względem adresu URL i T jest docelowego.

Powyższe w zasadzie mówi, że jeśli schemat jest określony we względnym URI, to uri docelowy będzie całkowitą wartością URI, więc jedynym sposobem na określenie schematu jest określenie całego adresu URL.

Jeśli chcesz korzystać z podejścia opartego na JavaScript, możesz dynamicznie ustawić href, używając np.: a.href = 'https://' + window.location.host + a.getAttribute('href'). Gdzie a jest twoim AnchorElement.

Oto demo wersji javascript: http://jsfiddle.net/7DWV5/

jednak w dużej mierze z tego powodu już napotkanego, że jest to dobry pomysł, aby albo zapisać nazwę hosta w pliku konfiguracyjnym, lub wykrycia go z nagłówek HTTP Request Host w kontrolerze frontowym. W ten sposób możesz po prostu złożyć go w HTML podczas generowania strony. Dzięki temu nie trzeba używać skryptów po stronie klienta, aby naprawić adresy URL po ich wygenerowaniu, co może być pożądane, ponieważ nie każdy ma włączoną obsługę JavaScript.

0

Powinieneś dodać https do konkretnych adresów URL swojej strony, używając również .htaccess. Upewnij się, że plik .htaccess zawiera wiersz:

RewriteEngine on 

Następnie spróbuj dodać ten wiersz po nim:

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

Spowoduje to dodanie dodatkowego żądania HTTP i nie zadziała, aby dany zasób mógł zostać obsłużony przy użyciu zarówno protokołu HTTP, jak i HTTPS (uniemożliwia dostęp do zasobu przez HTTP). Jeśli dostęp do zasobu ma być możliwy tylko przez HTTPS, konieczne jest coś podobnego, co blokuje dostęp przez HTTP. – Paulpro

0

W JavaScript można zrobić coś takiego:

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

Nie chciałbym. Jeśli chcesz, aby użytkownik korzystał z protokołu SSL, powinienem przekierować stronę na stronę SSL. Najpierw powinienem przekierować na stronę SSL

1

Myślę, że nie ma "prostego" rozwiązania ... Wygląda na to, że javascript być złym pomysłem do takich celów.

można spróbować:

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

umieszczone w nagłówku dokumentu.

LUB

twój pomysł:

<a href="/test-me1/">regular link 1</a> 
<a href="/test-me2/">regular link 2</a> 
<a href="/https/test-me3/">secure link</a> 

i na dnie, ale przed zamknięciem ciała tag miejsce coś takiego:

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

lub nawet prościej:

<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

Znowu javascript nie jest dobrym pomysłem do takich celów. (może być w zasadzie wyłączony lub nieobsługiwany, itp.). @Paulpro ma rację, lepiej zrobić stronę serwera adresów URL https. – Chris

+1

Innym pomysłem jest użycie względnego adresu URL protokołu w tagu podstawowym. – Chris

Powiązane problemy