7

我試圖用http auth basic保護~/public_html/dev目錄,但爲了確保安全,我想通過ssl來運行它。通過HTTPS進行通過URL重寫進行HTTP身份驗證

如果請求URI以/dev開始並且正常工作,則以下.htaccess文件的中間部分切換到https。

該文件的最後一部分工作正常,但無法正確使用https重定向。

我基本上想要能夠輸入http://www.example.com/dev/some_sub_dir/並被重定向到https://www.example.com/dev/some_sub_dir/並提示輸入http認證用戶名和密碼。

當前發生的事情是,如果我去http://www.example.com/dev/some_sub_dir/我得到一個用戶名和密碼通過端口80,然後立即再次通過端口443得到提示。所以我的憑據被髮送兩次,一次在明確,一次加密。使整個https url重寫變得毫無意義。

這樣做的原因是,我不會無意中通過http提交我的用戶/密碼; https將永遠用於訪問/dev目錄。

.htaccess位於~/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

回答

10

有一個比較流行的黑客做的基本身份驗證之前強制HTTPS。我第一次看到在這裏:

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

它涉及到使用自定義錯誤文檔處理HTTPS檢查失敗後,無論發生什麼情況。

例如,我有一個頁面,我需要強制使用HTTPS,所以我這樣做在.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> 

翻譯爲:

如果請求的頁面「 secure-page.php' - 如果不是HTTPS,那麼重定向到一個自定義'錯誤頁面' - '錯誤頁面'實際上就是頁面的HTTPS版本 - 在第二個請求中,因爲HTTPS檢查現在通過,執行Basic驗證:)

您可以將此概念擴展到目錄或其他用途案例 - 您的自定義'錯誤頁面'可能是一個重定向到正確的HTTPS URL或上述鏈​​接中的CGI腳本的PHP頁面...

+0

,這很漂亮 – Matthew 2012-12-05 09:41:28

+0

是的,可能不是最佳解決方案,但經過四個小時發現自己處於和你一樣的困境中,它是最好的解決方案我可以找到:) – siliconrockstar 2012-12-06 22:20:33

+0

我試了一下,然後一些;這個解決方案對我來說最合適。我刪除了FilesMatch指令,然後驗證了所有內容 - 如果訪問者未定義文件(例如, index.php文件。 http://www.askapache.com/htaccess/apache-ssl-in-htaccess-examples.html也會給你很多好的信息;基於此,我還包含SSLOptions + StrictRequire – Praesagus 2013-03-18 23:43:57

2

使用基本身份驗證保護內容將無法安全地通過HTTP進行。

一旦用戶輸入了他們的用戶名和密碼,它將以不加密的方式發送到每個網頁瀏覽到該網站 - 它不只是發送用戶提示的時間。

您必須通過HTTP將請求視爲未經過身份驗證,並且通過HTTPS登錄的所有都是

很多網站都使用HTTPS進行登錄 - 使用表單和Cookie,而不是基本身份驗證 - 然後轉到HTTP。這意味着他們'你已登錄'的cookie會以未加密方式發送。每個有價值的目標都因此而遭到黑客攻擊,而且gmail現在正在切換到完整的HTTPS,其他的則會隨之而來。

您沒有與其他人一樣的縮放問題,導致他們遠離計算成本更高的HTTPS。如果您的主頁支持HTTPS訪問,請始終使用它。

+0

它讓我感到困惑,在重新閱讀這個問題時,你好像知道我寫的建議;然而,我認爲它對其他人稍後閱讀線索以查看我的理由有用,所以我會讓它留下。 – Will 2010-02-08 08:10:23

+1

你甚至讀過這個問題嗎?他希望通過HTTPS使用HTTP身份驗證。但是,身份驗證發生在從HTTP到HTTPS的重定向之前。因此,請求* http://example.com/dev/...*提示身份驗證,然後發生重定向並請求* https://example.com/dev/...*提示另一個身份驗證。他想要的是首先重定向,然後提示認證。 – Gumbo 2010-02-08 08:12:07

+0

@Gumbo yeap我在第二次閱讀時選擇了它,並將其註釋爲 – Will 2010-02-08 08:24:02

0

是否將您的驗證部分放在使用協議作爲術語的<Location><LocationMatch>標記中?

4

我遇到了同樣的問題,並最終找到了一個難看的解決方案,但它的工作原理。將重寫規則放置在httpd.conf或其中一個conf.d文件(即「Main」服務器配置)中的Directory指令中。然後,在ssl.conf(或您的SSL VirtualHost定義的任何位置)將Auth *和Require行放置在Directory指令內的<VirtualHost _default_:443>容器內。

對於我來說,這意味着創建一個文件/etc/httpd/conf.d/test.conf有:

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

...然後加入剛好</VirtualHost>上面的標籤裏面/etc/httpd/conf.d/ssl.conf如下:

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

這樣做可以使Apache的應用重寫規則所有的請求,並且認證要求,只有在443虛擬主機的請求。

1

如果將重寫規則放置在主配置中,在任何或類似位置之外,重寫將在認證之前完成。

Rewrite Tech

0

我用這種方式解決它。只要允許非SSL,因爲它會被重定向則需要身份驗證一次就SSL ...

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 
4

大廈siliconrockstar的回答,我加入了一個PHP腳本,將在要上強制SSL的情況下工作全部這些文件,而不僅僅是siliconrockstar顯示的單個文件的情況。這裏再次與htaccess文件一起使用。

htaccess的保護到整個目錄:

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

通過htaccess的調用的PHP(在此示例的htaccess的PHP給出的路徑是你的站點的根目錄),這迫使HTTPS的網址你呼籲:

<?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???"; 
} 
?> 

如果您的網站沒有SSL證書,您將不得不安裝一個。如果這是您唯一的用途,您可以安裝自簽名證書。在一個cPanel VPS上與您的網站建立專用IP,需要花時間做:在WHM,請訪問

一。生成SSL證書和簽名請求

然後

二。在域上安裝SSL證書

0

我知道這是一個老問題,但我遇到了一個簡單的問題。訪問重定向。在我遇到許多其他問題和答案之後,我終於把這個按預期工作的htaccess放在一起。

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 

要注意

Order allow,deny 

這就是從我看到很多其他的答案缺少的,因爲它會使用HTTPS時,允許直接的人。我的測試中缺少的其他部分如下:

Satisfy Any 

以下片段允許非SSL客戶端與重定向。 HTTPS env var是從mod_ssl爲ssl客戶端設置的。

Allow from env=!HTTPS 
+1

這不起作用,它只是允許所有流量通過 – nbsp 2015-03-04 23:36:59

相關問題