سؤال

أحاول حماية ~/public_html/dev دليل باستخدام مصادقة HTTP Basic، ولكن لجعل ذلك آمنا أريد تشغيله عبر SSL.

القسم الأوسط من أدناه .htaccess مفاتيح الملف إلى https إذا بدأ الطلب URI /dev ويعمل.

يعمل القسم الأخير من الملف أيضا ولكنه لا يعمل بشكل صحيح مع إعادة توجيه HTTPS.

أنا أساسا أريد أن أكون قادرا على الكتابة http://www.example.com/dev/some_sub_dir/ وتكون إعادة توجيهها إلى https://www.example.com/dev/some_sub_dir/ ودفع اسم مستخدم وكلمة مرور HTTP Auth.word.

ما يحدث حاليا هو إذا ذهبت إلى http://www.example.com/dev/some_sub_dir/ أحصل على اسم مستخدم وكلمة مرور عبر المنفذ 80، ثم يتم مطالبته مرة أخرى مرة أخرى عبر المنفذ 443. لذلك يتم إرسال بيانات اعتمادي مرتين، مرة واحدة في الوضوح، وبشفر مرة واحدة. جعل عنوان URL الخاص ب HTTPS بأكمله

سبب القيام بذلك هو حتى أنني لن أكون قادرا على تقديم مستخدم / تمر بطريق الخطأ عبر HTTP؛ سوف تستخدم HTTPS دائما للوصول إلى /dev الدليل.

ال .htaccess في ال ~/public_html/dev الدليل.

# أعد كتابة قواعد rewrite.com rewriteEngine على rewritebase / # force / dev عبر https rewritecond٪ {https}! على rewriteCond٪ {replay_uri} ^ / dev rewriterule (. *) https: //٪ {http_host} #٪ {repact_uri} # هل Auth AuthType Basic Authname "DEV" AuthuserFile / Home/matt/Public_html/dev/.htpasswd تتطلب صالحة للمستخدم
هل كانت مفيدة؟

المحلول

هناك اختراق شعبية نسبيا لإجبار 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 تحقق الآن يمر، أداء المصادقة الأساسية :)

يمكنك تمديد هذا المفهوم إلى دليل أو حالات الاستخدام الأخرى - يمكن أن تكون صفحة الخطأ المخصصة الخاصة بك صفحة PHP التي تعيد توجيهها إلى عنوان URL الصحيح HTTPS، أو النصي CGI كما هو الحال في الرابط أعلاه ...

نصائح أخرى

لقد ركضت في نفس المشكلة وأخيرا وجدت حل قبيح، لكنها تعمل. ضع قاعدة إعادة الكتابة في توجيه دليل في httpd.conf أو أحد ملفات conf.d الخاص بك (أي في تكوين الخادم "الرئيسي"). ثم، ضع المصادقة * وتتطلب خطوطا في توجيه الدليل داخل ال <VirtualHost _default_:443> حاوية في SSL.Conf (أو أينما تم تعريف Virtualhost SSL).

بالنسبة لي، هذا يعني إنشاء ملف /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>

... ثم إضافة ما يلي الداخل /etc/httpd/conf.d/ssl.conf فقط فوق </VirtualHost> بطاقة شعار:

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

القيام بذلك يجعل Apache قم بتطبيق إعادة كتابة جميع الطلبات، ومتطلبات المصادقة فقط للطلبات فقط في VirtualHost 443.

بناء على إجابة 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

يتم استدعاء PHP بواسطة HTACCESS (المسار المعطى ل PHP في هذه العينة HTACCESS هو جذر موقعك)، الذي يفرض HTTPs على عنوان URL الذي اتصلت به:

<?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 على مجال

لن يعمل حماية المحتوى مع المصادقة الأساسية أبدا على HTTP.

بمجرد أن يدخل المستخدم اسم المستخدم وكلمة المرور الخاصة بهم، يتم إرسالها غير مشفرة لكل عرض صفحة إلى هذا الموقع - ليس فقط أرسل الوقت الذي يحصل عليه المستخدم.

عليك أن تعامل مع الطلبات عبر HTTP كقوة مصادقة، وتفعل الكل تسجيل الدخول في الاشياء على https.

استخدمت الكثير من المواقع الإلكترونية HTTPS لتسجيل الدخول - باستخدام النماذج وملفات تعريف الارتباط، بدلا من المصادقة الأساسية - ثم انتقل إلى HTTP بعد ذلك. هذا يعني أنه "لقد قمت بتسجيل الدخول" يتم إرسال ملف تعريف الارتباط غير المشفرة. تم اختراق كل هدف قيمة بسبب هذا، ويتحول Gmail الآن إلى HTTPS الكامل وسوف يتبع الآخرون.

ليس لديك نفس مشكلات التحجيم التي كان لدى الآخرين الذين لديهم ذلك بعيدا عن https الأكثر تكلفة. إذا كانت صفحتك الرئيسية تدعم الوصول إلى HTTPS، فاستخدمها طوال الوقت.

إذا وضعت قواعد إعادة الكتابة في التكوين الرئيسي، فسيتم إعادة كتابة أي إعادة كتابة خارج أو أو ما شابه ذلك قبل المصادقة.

يرى إعادة كتابة التكنولوجيا

هل يعمل لوضع قسم المصادقة الخاص بك في <Location> أو <LocationMatch> علامة باستخدام البروتوكول مثل المصطلح؟

أنا حولها بهذه الطريقة. فقط السماح لغير 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

أعلم أن هذا سؤال قديم لكنني تواجهني مشكلة مع إعادة توجيه HT.Access بسيطة. بعد العديد من المشاكل والأجوبة الأخرى التي وضعت أخيرا معا هذا 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

لدي اثنين من إجابات على السؤال، واحد مع عقلية 2010، وواحد مع عقلية ما بعد عام 2012.

للإجابة على هذا السؤال كما لو كان عام 2010 عندما تم سؤاله: استخدم تكوينات VirtualHost مختلفة.

هذا الحل خارج نطاق القليل من نطاق السؤال كما هو الاعداثية هو "أنا فقط الوصول إلى تعديل .htaccess"ولكن حلا قابلا للتطبيق في كثير من الحالات هو طلب المسؤول du Jour إلى إعداد تكوينات Virtualhost مختلفة.

  • لم يتم تكوين Virtualhost غير SSL للوصول إلى أي شيء على نظام الملفات، وعدم إرجاع 301 يعيد توجيهات إلى https://... مواقع لجميع الطلبات.

  • يتم بعد ذلك مجانا إذن SSL الاستماع Virtualhost على تطبيق المصادقة الأساسية دون قلق من أن المستمع المتشعب القياسي سيتخلص من البضائع.

ومع ذلك، مع Hat Post-2018، وإذ تلاحظ أن هذا السؤال تم طرحه قبل Apache 2.4 (أوائل عام 2012؟)، فقد حان الوقت للتحديث. أباتشي 2.4 قدمت <If condition> الشيكات، مما يجعل هذا أسهل وأكثر مباشرة:

  • أولا، لا iFModule rewriteengine. نظرا لأن Apache يستمع على كل من المنفذ 80 و 443 (في الإعداد القياسي)، ونريد إنفاذ SSL، نريد أن ينكسر الخادم إذا تم تفتيش وحدة إعادة الكتابة وإلا خلاف ذلك.

    RewriteEngine On 
    
  • ثانيا، ببساطة ما يكفي، أداء إعادة توجيه فوري ودائم (301) إذا كان الطلب غير آمن. لاحظ R (EDIRET) و L (AST) الذي يعمل معا لضمان إعادة توجيه الطلبات غير المشفرة ولا يمكن استخدامها لكسب الوصول غير المصادق. (بالنسبة للموجود القهري، غير نسخ معجون التفكير، لاحظ قلة المسافة بين ذلك != و on. وبعد هذا مقصود.)

    RewriteCond %{HTTPS} !=on 
    RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,QSA,L,NC]
    
  • أخيرا، استخدم هذا المتغير نفسه مع <If-condition> تحقق للتأكد من أننا نطلب فقط كلمة المرور لطلب TLS.

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

وإجمالا:

# .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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top