7

अपाचे के लिए जगह हो लगता है इसलिए यहाँ जाता है :)Apache 2.2 एसएसएल को रीडायरेक्ट * तो * (समाधान के साथ <लेकिन यह बकवास है?)

उम्र पुरानी समस्या: कैसे तो मैं HTTP- अनुप्रेषित> प्रमाणन करना एचटीटीपीएस, तब और केवल अगर एचटीटीपीएस, एक औथ करें?

ओह - और मुझे पसंद है एक स्निपेट में इसमें से अधिकांश कि कई < निर्देशिका > या < स्थान > ब्लॉकों में शामिल करें-एड, इसलिए कोई वर्चुअल होस्ट स्तर यादृच्छिक पथ आधारित पुनर्लेखन किया जा सकता है चाहता हूँ ...

ठीक है, यहाँ है क्या मुझे लगता है कि काम करने के लिए प्रतीत होता है है:

एक VirtualHost के शीर्ष में ब्लॉक

# Set ssl_off environment variable 
RewriteEngine on 
RewriteCond %{HTTPS} =on 
RewriteRule^- [E=ssl] 

स्थान या निर्देशिका ब्लॉक

RewriteEngine on 
# Case 1 redirect port 80 SSL 
RewriteCond %{HTTPS} !=on 
RewriteCond %{SERVER_PORT} =80 
RewriteRule^https://%{SERVER_NAME}%{REQUEST_URI} [R=301] 

AuthType Basic 
AuthBasicProvider external 
AuthExternal auth_pam 
AuthName "My Underpants" 
AuthzUnixgroup on 
Order Deny,Allow 
Deny from all 
Allow from env=!ssl 
Satisfy any 
Require group nice-users 

Pluses

कि बार के सभी की आवश्यकता होती है के दशक में बाहर प्रत्येक स्थान पर एक पंक्ति में शामिल करने के लिए एक टुकड़ा फाइल करने के लिए निकाला जा सकता है

यह ठीक करता है प्रत्येक स्थान के लिए एसएसएल और प्रमाणीकरण को एक साथ मजबूर करना, गलतियों की कम संभावना

माइनस

खूनी नरक, यह शायद ही सहज है! मुझे पता है कि सभी के लिए नाजुक हो सकता है ...

क्या कोई बेहतर तरीका है (मुझे नहीं मिला ...)?

टिप्पणियाँ है कि क्या है कि किसी भी गंभीर खामियां :)

है पर बहुत स्वागत किया जाएगा एक तरफ जीवन बहुत आसान हो सकता है अगर अपाचे एक सामान्य

< साथ एक समझदार config वाक्य रचना था अभिव्यक्ति > </यदि >

ब्लॉक जो कहीं भी उपयोग किया जा सकता है। इसमें कुछ विशेष केस ब्लॉक हैं जैसे कि ifModule, और उसके बाद आपके पास रीवाइटकॉन्ड जैसे विशेष केस सशर्त हैं (यदि आप इसका उपयोग नहीं करते हैं तो ग्रोक करना बहुत मुश्किल है)।

चीयर्स,

टिम

+0

तुम्हारा मतलब है तुम एसएसएल के लिए VH पर प्रबंधन करने के लिए नहीं करना चाहते हैं और गैर- SSL के लिए एक के लिए उपयोगी है? – regilero

+0

यदि आप अपाचे 2.4 पर जा सकते हैं, तो इस समस्या के लिए सभ्य समाधान हैं ... http://stackoverflow.com/a/26155051/762028 – Molomby

+0

उपयोगकर्ता प्रमाणीकरण के लिए पूछने से पहले [Apache .htaccess HTTPS पर रीडायरेक्ट] का संभावित डुप्लिकेट] (https://stackoverflow.com/questions/10267102/apache-htaccess-redirect-to-https-before-asking-for-user- प्रमाणीकरण) – LWC

उत्तर

3

आप https करने के लिए पूरी साइट के लिए मजबूर करना चाहते हैं, तो आपको VirtualHost निर्देशों का उपयोग कर सकते हैं, और फिर यह काफी सरल है:

<VirtualHost *:80> 
    ServerName example.com 

    RedirectMatch (.*) https://example.com$1 

</VirtualHost> 

<VirtualHost *:443> 
    ServerName example.com 

    ... 
    ... 
    ... 
</VirtualHost> 
+0

सरल और प्रभावी! – aland

-1

मैंने आपके समाधान का परीक्षण किया है और यह काम नहीं किया है ...

एक बहुत अधिक समय लगा के बाद खोज समाधान, बहुत ज्यादा googling और हमेशा एक ही चीजें हैं जो काम नहीं किया, मैं अंत में ऐसा किया पाया: मैं SSLRequireSSL का उपयोग करें और एक ErrorDocument 403 एक जावास्क्रिप्ट कोड के साथ एक स्थैतिक पृष्ठ के साथ विन्यस्त (करने के लिए धन्यवाद this blog page)।

/etc/apache2/conf.d.opt/redirect_if_not_https.conf में:

SSLRequireSSL 
ErrorDocument 403 "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\ 
<html><head>\ 
<title>403 Forbidden</title>\ 
<script language=\"JavaScript\">\ 
window.location='https://'+window.location.hostname+window.location.pathname;\ 
</script>\ 
</head><body>\ 
<h1>Forbidden</h1>\ 
<p>You don't have permission to access that resource using simple HTTP. Please use HTTPS instead.</p>\ 
</body></html>" 

(ध्यान दें कि मैं /etc/apache2/conf.d.opt/ बनाई गई)

और किसी ऐप conf में, (/etc/apache2/conf.d/trac.conf में उदाहरण के लिए) उस फ़ाइल में शामिल हैं:

<LocationMatch "/trac"> 
    # All the classical configurations here 
    # ... 

    Include conf.d.opt/redirect_if_not_https.conf 
</LocationMatch> 
+0

यह मेरे लिए काम नहीं किया। पृष्ठ अभी भी http पर मूल लेख करने की कोशिश करता है। – sonofagun

+0

यह मेरे लिए काम करता है, जिस पर आप ओएस ऐसा करने की कोशिश कर रहे हैं? –

+0

वैज्ञानिक लिनक्स। – sonofagun

2

टिम वत्स 'समाधान मेरे लिए सबसे अच्छा काम करता प्रतीत होता है लेकिन थोड़ा सा tweaking की जरूरत है। इसके अलावा मेरी स्थिति थोड़ा अलग है कि मैं कुछ आईपी पते को HTTP ऑथ के बिना अनुमति देना चाहता हूं लेकिन यह सिर्फ एक अतिरिक्त लाइन जोड़ता है।

mod_rewrite डिफ़ॉल्ट रूप से वर्चुअलहोस्ट से कॉन्फ़िगर प्राप्त नहीं करेगा।

देखें: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriteoptions

मैं की "RewriteOptions वारिस" उपयोग करने के लिए जा रहा था लेकिन ऐसा लगता है कि इस बच्चे को लोगों के बाद माता-पिता नियम लागू होता है। किसी भी मामले में, मैंने एक अलग समाधान के बारे में सोचा।

SetEnvIf Request_URI "/" using_ssl=yes 

यह using_ssl वातावरण चर सेट करता है, तो अनुरोध URI फॉरवर्ड स्लैश शामिल यह मैं के रूप में हैक का एक सा है:

मेरी एसएसएल <VirtualHost> के भीतर मैं रेखा है (यानी हर समय।)

आंतरिक वातावरण इस निर्देश द्वारा निर्धारित चर के बाद सेट कर रहे हैं सबसे जल्दी अनुरोध प्रसंस्करण निर्देशों ऐसे अभिगम नियंत्रण और URI करने वाली फ़ाइल नाम मानचित्रण के रूप में, चलाए जा रहे हैं: 'बिना शर्त setenv लेकिन जाहिरा तौर पर उपयोग करना पसंद करूंगा। यदि आप जिस परिवेश परिवर्तक को सेटिंग कर रहे हैं, वह रीवाइट्रूल निर्देश जैसे प्रसंस्करण के प्रारंभिक चरण में इनपुट के रूप में है, तो आपको इसके बजाय पर्यावरण चर को SetEnvIf के साथ सेट करना चाहिए।

(स्रोत: http://httpd.apache.org/docs/2.2/mod/mod_env.html#setenv)

मेरी कंटेनर के भीतर मेरे config इस तरह दिखता है:

# Require a basic HTTP auth user 
AuthName "realm-name-goes-here" 
AuthType Basic 
AuthUserFile /var/www/etc/htpasswd 
Require valid-user 

# OR allow from non-SSL (which will be redirected due to mod_rewrite below!) 
Order Allow,Deny 
Allow from env=!using_ssl 

# OR allow from a trusted IP range 
# NB: This allows certain IPs without a username & password 
Allow from 192.168.0.0/16 

Satisfy Any 

# Force a redirect to HTTPS 
RewriteEngine On 
RewriteCond %{HTTPS} !=on 
RewriteRule^https://%{SERVER_NAME}%{REQUEST_URI} [L,R=permanent] 

आप शायद सिर्फ 'आर' के साथ की कोशिश करने के बजाय 'आर = स्थायी' के पहले के लिए चाहते हैं परीक्षण उद्देश्यों।

आशा इस दूसरों :)

संबंधित मुद्दे