Domanda

Sto cercando di proteggere la directory ~/public_html/dev utilizzando http autenticazione base, ma per fare che sicuro voglio farlo funzionare su SSL.

La sezione centrale dei sottostanti opzioni di file .htaccess a HTTPS se la richiesta URI inizia con /dev e lavora.

L'ultima sezione del file funziona così ma non funziona correttamente con i https reindirizzamento.

Io fondamentalmente voglio essere in grado di digitare http://www.example.com/dev/some_sub_dir/ ed essere reindirizzato a https://www.example.com/dev/some_sub_dir/ e viene richiesto il nome utente e la password http auth.

Quello che succede è attualmente se vado a http://www.example.com/dev/some_sub_dir/ ottengo richiamato per un username e una password sulla porta 80, e poi subito ottengo richiamato ancora una volta sulla porta 443. Quindi due volte le mie credenziali vengono inviati, una volta in chiaro, e Una volta crittografati . Rendendo l'intero https URL Rewrite un po 'inutile.

Il motivo per fare questo è così che non sarò in grado di presentare accidentalmente il mio utente / passare http; https sarà sempre utilizzato per accedere alla directory /dev.

Il .htaccess si trova nella directory ~/public_html/dev.

# Rewrite Rules for example.com
RewriteEngine On
RewriteBase /

# force /dev over https
RewriteCond %{HTTPS} !on
RewriteCond %{REQUEST_URI} ^/dev
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

# do auth
AuthType Basic
AuthName "dev"
AuthUserFile /home/matt/public_html/dev/.htpasswd
Require valid-user
È stato utile?

Soluzione

C'è un hack relativamente popolare per forzare HTTPS prima di fare l'autenticazione di base. prima ho visto qui:

http://blog.jozjan.net/2008/02 /htaccess-redirect-to-ssl-https-before.html

Si tratta di utilizzare un documento di errore personalizzato per gestire qualsiasi cosa accada dopo il controllo HTTPS non riesce.

Per esempio, ho una singola pagina ho bisogno di forzare HTTPS su, così ho fatto questo in un file .htaccess:

<FilesMatch "secure-page.php">
    SSLRequireSSL
    ErrorDocument 403 https://www.example.com/secure-page.php
    AuthType Basic
    AuthName "Secure Page"
    AuthUserFile /var/www/whatever/.htpasswdFile
    Require valid-user
</FilesMatch>

Il che si traduce in:

Se la pagina richiesta è 'sicuro-page.php' - se non HTTPS, quindi reindirizzare a una 'pagina di errore' su misura - la 'pagina di errore' è in realtà solo la versione HTTPS della pagina - sulla seconda richiesta, dal momento che il controllo HTTPS ora passa, eseguire Auth di base:)

È possibile estendere questo concetto a una directory o altro uso dei casi - la tua 'pagina di errore' personalizzato potrebbe essere una pagina php che reindirizza all'URL HTTPS corretto, o uno script CGI, come nel link qui sopra ...

Altri suggerimenti

Ho incontrato lo stesso problema e finalmente trovato una soluzione brutto, ma funziona. Mettere la regola di riscrittura in una direttiva Directory in httpd.conf o uno dei tuoi file conf.d (cioè, nella configurazione del server "principale"). Poi, mettere l'Auth * e Richiedono linee in una direttiva Directory all'interno il contenitore <VirtualHost _default_:443> in ssl.conf (o dovunque il tuo SSL VirtualHost è definito).

Per me, questo significa che la creazione di un file /etc/httpd/conf.d/test.conf con:

<Directory "/var/www/html/test">
        #
        # force HTTPS
        #
        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</Directory>

... e poi aggiungendo il seguente /etc/httpd/conf.d/ssl.conf all'interno appena sopra il tag </VirtualHost>:

<Directory "/var/www/html/test">
        #
        # require authentication
        #
        AuthType Basic
        AuthName "Please Log In"
        AuthUserFile /var/www/auth/passwords
        Require valid-user
</Directory>

In questo modo si rende Apache applicare la RewriteRule a tutte le richieste e le esigenze auth solo alle richieste del 443 VirtualHost.

Sulla risposta di siliconrockstar, sto aggiungendo uno script php che avrebbe funzionato nel caso in cui si vuole forzare SSL su tutti i file, non solo il caso di un singolo file mostrati da siliconrockstar. Anche in questo caso funziona in combinazione con il file .htaccess.

Il .htaccess per proteggere a directory intero:

    SSLRequireSSL
    ErrorDocument 403 /yourphp.php
    AuthType Basic
    AuthName "Secure Page"
    AuthUserFile /some_path_above_the_html_root/.htpasswdFile
    Require valid-user

Il php chiamato dal .htaccess (il percorso dato per il php in questo campione .htaccess è la radice del vostro sito), che costringe https sull'URL hai chiamato:

<?php
$path = "https://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
if ( $_SERVER['SERVER_PORT'] == 80) {
    header("Status: 302 Moved\n");
    header("Location: ".$path."\n\n");
}
else {
    header( "Content-type: text/html\n\n");
    echo "How did you get here???";
}
?>

Se il tuo sito non dispone di un certificato SSL, dovrete installare uno. Se questo è il vostro uso solo per essa, è possibile installare un certificato auto-firmato. Su un cPanel VPS con il tuo sito su un IP dedicato, che vuole un attimo a fare: a GSA, visitare

Uno. Generare un certificato SSL e Signing Request

poi

Due. Installare un certificato SSL in un dominio

La protezione dei contenuti con l'autenticazione di base non funzionerà mai sicuro su HTTP.

Una volta che l'utente ha inserito il proprio nome utente e password, viene inviato in chiaro per ogni visualizzazione di una pagina di quel sito -. La sua non appena inviato momento in cui l'utente viene richiesto

Si deve trattare richieste su HTTP come non autenticato, e fare tutti loggato roba su HTTPS.

Un sacco di siti web hanno utilizzato HTTPS per l'accesso - usando le forme e biscotti, piuttosto che autenticazione di base - e poi andare al HTTP dopo. Ciò significa che il loro 'si è connessi' cookie viene inviato in chiaro. Ogni bersaglio valido è stato violato a causa di questo, e Gmail è ora di passare a HTTPS pieno e gli altri seguiranno.

Non si dispone gli stessi problemi di scala che altri hanno avuto che li ha tenuti lontani dalla HTTPS computazionalmente più costoso. Se la tua home page supporta l'accesso HTTPS, usarlo in tutto.

Se si posizionano le regole di riscrittura nella configurazione principale, al di fuori o qualsiasi o simili, la riscrittura sarà fatto prima dell'autenticazione.

Rewrite Tech

Funziona per mettere la vostra sezione di autenticazione in un tag o <Location> <LocationMatch> utilizzando il protocollo come il termine?

I aggirare in questo modo. Basta consentire non-SSL, poiché sarà reindirizzato quindi richiedono l'autenticazione SSL una volta su ...

SetEnvIf %{SERVER_PORT} ^80$ IS_NON_SSL

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

AuthUserFile /.htpasswd
AuthName "Enter your Username and Password:"
AuthType Basic
require valid-user
Allow from env=IS_NON_SSL

So che questa è una vecchia questione, ma ho avuto problemi con un semplice reindirizzamento ht.access. In seguito molti altri problemi e le risposte alla fine ho messo insieme questo .htaccess che funziona come previsto.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

AuthName "Private Server"
AuthUserFile /var/www/.htpassword
AuthType Basic
require valid-user
Order allow,deny
Allow from env=!HTTPS
Satisfy Any

Da segnalare la

Order allow,deny

Che è quello che mancava da molti altri risposte che ho visto in quanto consentirebbe persone direttamente quando si utilizza https. L'altra sezione che mancava dal mio test è stato il seguente:

Satisfy Any

Questa seguente frammento è ciò che permette ai clienti non SSL con per il reindirizzamento. Il var HTTPS ENV è impostato dal mod_ssl per i client SSL.

Allow from env=!HTTPS

Ho due risposte alla domanda, uno con una mentalità 2010, e una con una mentalità post 2012.

Per rispondere a questa domanda, come se fosse del 2010, quando è stato chiesto:. Utilizzare due diverse configurazioni VirtualHost

Questa soluzione è un po 'al di fuori della portata della questione, come l'implicazione è "Ho solo l'accesso per modificare .htaccess!" ma una soluzione praticabile in molti casi, è quello di chiedere all'amministratore du jour semplicemente messa a punto due diverse configurazioni VirtualHost.

  • Il non-SSL VirtualHost non è configurato per accedere a qualsiasi cosa sul filesystem, e semplicemente ritorna reindirizzamenti 301 per https://... riprese per tutte le richieste.

  • Lo SSL ascolto VirtualHost è quindi libero di implementare l'autenticazione di base senza preoccuparsi che l'ascoltatore standard HTTP darà via la merce.

Tuttavia, con il mio cappello post-2018, e notando che questa domanda è stato chiesto prima di Apache 2.4 (all'inizio del 2012?), È il momento per un aggiornamento. Apache 2.4 introdotte <If condition> controlli, che rende questo molto più facile e più diretto:

  • In primo luogo, non IfModule il RewriteEngine. Come Apache è in ascolto sulla porta 80 sia e 443 (nella configurazione standard), e vogliamo far rispettare SSL, vogliamo che il server per rompere se il modulo di riscrittura è altrimenti disattivato.

    RewriteEngine On 
    
  • In secondo luogo, abbastanza semplice, eseguire un immediato e permanente (301) reindirizzare se la richiesta non è sicuro. Notare la R (edirect) e L (AST), che lavorano insieme per garantire che le richieste non crittografati vengono reindirizzati e non possono essere utilizzati per ottenere l'accesso non autenticato. (Per l'OCD, non-copia-incolla mentalità, prendere nota del mancanza di spazio tra != e on. Questo è intenzionale.)

    RewriteCond %{HTTPS} !=on 
    RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,QSA,L,NC]
    
  • Infine, utilizzare la stessa variabile con un controllo <If-condition> per garantire che abbiamo solo bisogno della password per la richiesta di TLS.

    <If "%{HTTPS} == 'on'">
            AuthName "Password please!" 
            AuthType Basic 
            AuthUserFile /path/to/htpasswdfile
            AuthGroupFile /dev/null 
            require valid-user
    </If>
    

E del tutto:

# .htaccess

RewriteEngine On

RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,QSA,L,NC]

<If "%{HTTPS} == 'on'">
        AuthName "Password please!"
        AuthType Basic
        AuthUserFile /path/to/htpasswdfile
        AuthGroupFile /dev/null
        require valid-user
</If>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top