أحاول إعادة توجيه جميع طلبات HTTP غير الآمنة على موقعي (مثل http://www.example.com
) إلى HTTPS (https://www.example.com
). أنا أستخدم PHP راجع للشغل. هل يمكنني القيام بذلك في. htaccess؟
التحديث: على الرغم من أن هذه الإجابة قد قبلت منذ بضع سنوات ، لاحظ أن النهج الذي تتبعه يوصى به الآن ضد بواسطة وثائق Apache. استخدم Redirect
بدلاً من ذلك. انظر هذه الإجابة .
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}
مستندات Apache يوصي ضد استخدام إعادة كتابة:
لإعادة توجيه عناوين URL
http
إلىhttps
، قم بما يلي:<VirtualHost *:80> ServerName www.example.com Redirect / https://www.example.com/ </VirtualHost> <VirtualHost *:443> ServerName www.example.com # ... SSL configuration goes here </VirtualHost>
يجب أن ينتقل هذا المقتطف إلى ملف تهيئة الخادم الرئيسي ، لا إلى .htaccess
كما طلب في السؤال.
ربما لم تظهر هذه المقالة إلا بعد طرح السؤال والإجابة عليه ، ولكن يبدو أنها الطريقة الحالية للذهاب.
أوصي بإعادة توجيه 301:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
كما قلت في هذا السؤال ، أقترح عليك تجنب إعادة توجيه جميع طلبات HTTP إلى مكافئ HTTPS الخاص بهم بشكل أعمى ، لأنه قد يسبب لك انطباعًا خاطئًا بالأمان. بدلاً من ذلك ، ربما يتعين عليك إعادة توجيه "الجذر" لموقع HTTP الخاص بك إلى جذر موقع HTTPS والارتباط من هناك ، فقط إلى HTTPS.
المشكلة هي أنه إذا كان هناك رابط أو نموذج على موقع HTTPS يجعل العميل يرسل طلبًا إلى موقع HTTP ، فسيظهر محتواه قبل إعادة التوجيه.
على سبيل المثال ، إذا كانت إحدى صفحاتك المعروضة على HTTPS تحتوي على نموذج يقول <form action="http://example.com/doSomething">
ويرسل بعض البيانات التي لا ينبغي إرسالها بشكل واضح ، فسيرسل المتصفح أولاً الطلب الكامل (بما في ذلك الكيان ، إذا كان POST) إلى HTTP الموقع أولا. سيتم إرسال إعادة التوجيه على الفور إلى المتصفح ، وبما أن عددًا كبيرًا من المستخدمين يعطلون أو يتجاهلون التحذيرات ، فمن المحتمل أن يتم تجاهلها.
بطبيعة الحال ، قد يتسبب خطأ توفير الارتباطات التي يجب أن تكون لموقع HTTPS ولكن ينتهي بها الأمر بالنسبة لموقع HTTP في حدوث مشاكل بمجرد حصولك على شيء يستمع على منفذ HTTP على نفس عنوان IP الخاص بموقع HTTPS. ومع ذلك ، أعتقد أن الاحتفاظ بالموقعين "كمرآة" يزيد فقط من فرص ارتكاب الأخطاء ، حيث قد تميل إلى افتراض أنه سيصحح نفسه تلقائيًا عن طريق إعادة توجيه المستخدم إلى HTTPS ، في حين أن الوقت متأخر جدًا. (كانت هناك مناقشات مماثلة في هذا السؤال )
لقد وجدت أن أفضل طريقة لـ https و www على المجال هي
RewriteCond %{HTTPS} off
RewriteCond %{HTTPS_Host} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
هذا هو نهج إعادة توجيه HTML الذي يعمل ولكن ليس الأفضل.
<meta http-equiv="Refresh" content="0;URL=https://www.example.com" />
نهج PHP
<?php
function redirectTohttps() {
if ($_SERVER['HTTPS']!="on") {
$redirect= "https://".$_SERVER['HTTP_Host'].$_SERVER['REQUEST_URI'];
header("Location:$redirect");
}
}
?>
. htaccess Approch
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}
نسخ من: www.letuslook.org
يعجبني طريقة إعادة التوجيه هذه من http إلى https. لأنني لست بحاجة إلى تعديله لكل موقع.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R,L]
باستخدام التعليمات البرمجية التالية في ملف htaccess الخاص بك ، يعيد توجيه الزائرين تلقائيًا إلى نسخة HTTPS من موقعك:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
إذا كان لديك ملف htaccess موجود:
لا تكرر RewriteEngine في.
تأكد من أن الأسطر التي تبدأ RewriteCond و RewriteRule تتبع مباشرة RewriteEngine On الموجودة بالفعل.
هذه هي الطريقة المناسبة لإعادة توجيه HTTP إلى HTTPS باستخدام .htaccess وفقًا لموقع GoDaddy.com. السطر الأول من التعليمات البرمجية هو شرح ذاتي. يتحقق السطر الثاني من التعليمات البرمجية لمعرفة ما إذا كان HTTPS قيد إيقاف التشغيل ، وإذا كان الأمر كذلك ، فإنه يعيد توجيه HTTP إلى HTTPS عن طريق تشغيل السطر الثالث من التعليمات البرمجية ، وإلا يتم تجاهل السطر الثالث من التعليمات البرمجية.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
https://www.godaddy.com/help/redirect-http-to-https-automatically-8828
أفضل حل يعتمد على الاحتياجات الخاصة بك. هذا ملخص للإجابات التي تم نشرها مسبقًا مع إضافة بعض السياق.
إذا كنت تعمل مع خادم الويب Apache ويمكنك تغيير تهيئته ، فاتبع وثائق Apache :
<VirtualHost *:80>
ServerName www.example.com
Redirect "/" "https://www.example.com/"
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
# ... SSL configuration goes here
</VirtualHost>
لكنك سألت أيضًا ما إذا كان يمكنك القيام بذلك في ملف .htaccess
. في هذه الحالة ، يمكنك استخدام Apache's RewriteEngine :
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [L]
إذا كان كل شيء يسير على ما يرام وتريد أن تتذكر المتصفحات إعادة التوجيه هذه ، فيمكنك إعلانها دائمًا عن طريق تغيير السطر الأخير إلى:
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
ولكن كن حذرا إذا كنت قد غيرت رأيك في إعادة التوجيه هذه. تذكر المستعرضات ذلك لفترة طويلة جدًا ولن تتحقق مما إذا كانت قد تغيرت.
قد لا تحتاج إلى السطر الأول RewriteEngine On
وفقًا لتكوين خادم الويب.
إذا كنت تبحث عن حل PHP ، فراجع صفيف $ _SERVER و وظيفة الرأس :
if (!$_SERVER['HTTPS']) {
header("Location: https://" . $_SERVER['HTTP_Host'] . $_SERVER['REQUEST_URI']);
}
افعل كل ما هو موضح أعلاه لإعادة التوجيه. فقط أضف "HTTP Strict Transport Security" إلى عنوانك. هذا سوف تجنب الرجل في الهجوم الأوسط.
قم بتعديل ملف تكوين Apache (/etc/Apache2/sites-enabled/website.conf و /etc/Apache2/httpd.conf على سبيل المثال) وأضف التالي إلى VirtualHost:
# Optionally load the headers module:
LoadModule headers_module modules/mod_headers.so
<VirtualHost 67.89.123.45:443>
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>
https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
أضف التعليمات البرمجية التالية إلى ملف. htaccess:
Options +SymLinksIfOwnerMatch
RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^ https://[your domain name]%{REQUEST_URI} [R,L]
حيث [اسم المجال الخاص بك] هو اسم مجال موقع الويب الخاص بك.
يمكنك أيضًا إعادة توجيه مجلدات محددة خارج اسم المجال الخاص بك عن طريق استبدال السطر الأخير من الرمز أعلاه بـ:
RewriteRule ^ https://[your domain name]/[directory name]%{REQUEST_URI} [R,L]
لإعادة توجيه جميع طلبات http
إلى https
، يمكنك استخدام:
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [NE,L,R]
إذا لم يتم تمكين mod-rewrite وكنت على Apache 2.4 ، يمكنك أيضًا استخدام Redirect
داخل if
توجيه لإعادة توجيه طلبات http
إلى https
.
اباتشي 2.4.
<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
إذا كنت في موقف لا تستطيع فيه الوصول إلى تهيئة Apache مباشرةً لموقعك ، والتي لا تزال العديد من المنصات المستضافة مقيدة بها بهذه الطريقة ، فإنني أوصي فعلاً باتباع نهج من خطوتين. سبب قيام Apache أنفسهم بتوثيق أنه يجب عليك استخدام خيارات التكوين الخاصة بهم أولاً وقبل كل شيء على mod_rewrite لـ HTTP إلى HTTPS.
أولاً ، كما ذكر أعلاه ، يمكنك إعداد (قواعد) modhrewrite .htaccess:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
بعد ذلك ، في ملفك (ملفاتك) PHP(تحتاج إلى القيام بذلك في أي وقت يناسب وضعك ، ستقوم بعض المواقع بتوصيل جميع الطلبات من خلال ملف واحد PHP ، ومواقع أخرى عرض صفحات متعددة حسب احتياجاتهم والطلب المقدم):
<?php if ($_SERVER['HTTPS'] != 'on') { exit(1); } ?>
ما سبق يحتاج إلى تشغيل قبل أي كود يمكن أن يعرض البيانات الآمنة في بيئة غير آمنة. وبالتالي ، يستخدم موقعك إعادة التوجيه التلقائي عبر HTACCESS و mod_rewrite ، بينما يضمن البرنامج النصي (البرامج النصية) عدم توفير أي إخراج عند عدم الوصول إليه من خلال HTTPS.
أعتقد أن معظم الناس لا يعتقدون ذلك ، وبالتالي فإن Apache يوصي بعدم استخدام هذه الطريقة حيثما كان ذلك ممكنًا. ومع ذلك ، يستغرق الأمر مجرد فحص إضافي في نهاية التطوير للتأكد من أن بيانات المستخدم آمنة. نأمل أن يساعد هذا شخصًا آخر قد يضطر إلى النظر في استخدام طرق غير مستحسنة بسبب القيود المفروضة على خدمات الاستضافة لدينا.
من خلال. htaccess هذا سوف يساعد.
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_Host} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
أيضا ، راجع هذا لمزيد من التفاصيل. كيفية إعادة توجيه المتشعب إلى المتشعب؟
ما لم تكن بحاجة إلى mod_rewrite لأشياء أخرى ، فإن استخدام Apache core IF هو أنظف وأسرع
<If "%{HTTPS} == 'off'">
Redirect permanent / https://yoursite.com/
</If>
يمكنك إضافة المزيد من الشروط إلى توجيه IF ، مثل ضمان وجود مجال أساسي واحد دون بادئة www:
<If "req('Host') != 'myonetruesite.com' || %{HTTPS} == 'off'">
Redirect permanent / https://myonetruesite.com/
</If>
هناك الكثير من القصور الذاتي في استخدام mod_rewrite لكل شيء ، ولكن معرفة ما إذا كان هذا يناسبك أم لا.
مزيد من المعلومات: https://httpd.Apache.org/docs/2.4/mod/core.html#if
لرؤيتها في العمل (جرب دون www. أو https: // ، أو مع .net بدلاً من .com): https://nohodental.com/ (موقع أعمل عليه).
إذا كنت تستخدم Apache ، فإن mod_rewrite هو الحل الأسهل ولديه الكثير من الوثائق عبر الإنترنت حول كيفية القيام بذلك. على سبيل المثال: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html
هناك حافة مختلفة لهذه المشكلة عندما يتم تشغيل Load Balancer.
الموقف كالتالي: - حركة المرور من المستعرض إلى Load Balancer والعودة هي (يجب أن تكون) HTTPS - حركة المرور بين Load Balancer و WebServer الفعلي هي HTTP.
لذلك ، تظهر جميع متغيرات طلب الخادم في PHPأو Apache أن الاتصال هو مجرد HTTP. والدلائل HTTP و HTTPS على الخادم هي نفسها.
لا يعمل RewriteCondition في الإجابة المعتمدة. أنه يعطي حلقة أو أنه لا يعمل فقط.
السؤال هو: كيفية الحصول على هذا العمل على Load Balancer.
(أو تم تكوين Load Balancer بشكل خاطئ. وهذا ما آمله لأنه بعد ذلك يمكنني نقل المشكلة إلى شركة WebHosting :-))
خذ هذا الرمز إليك .htaccess file إعادة توجيه HTTP إلى HTTPS تلقائيًا
RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
إنه يعمل لي:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
</IfModule>
وعلى سبيل المثال ، http: // server/foo؟ email = someone٪ 40example.com يعيد التوجيه بشكل طبيعي دون أي مشاكل. الملف .htaccess موجود في مجلد جذر موقع الويب (على سبيل المثال ، ملف public_html). من الممكن استخدام RewriteCond٪ {SERVER_PORT}! ^ 443 $ بدلاً من ذلك RewriteCond٪ {HTTPS}! on
Redirect 301 / https://example.com/
(عملت لي عندما لم تنجح الإجابات المذكورة أعلاه)
علاوة:
ServerAlias www.example.com example.com
(https ثابت: // www . example.com غير موجود)
لقد وجدت طريقة لإجبار جميع صفحات موقعي على إعادة التوجيه من http إلى تمثيلي الصفحات على https التي تناسبني.
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
إذا كنت تستخدم Amazon Web Services Elastic Load Balancer الذي يقبل حركة مرور https ويوجهها إلى الخادم الخاص بك باستخدام http ، فإن الطريقة الصحيحة لإعادة توجيه حركة مرور http إلى https موصوفة هنا: https: // aws. Amazon.com/premiumsupport/knowledge-center/redirect-http-https-elb
استخدم رأس X-Forwarded-Proto (يحتوي على http أو https) والذي يتم تضمينه دائمًا في طلبات http من موازن التحميل ، كما هو موضح هنا: https://docs.aws.Amazon.com/elasticloadbalancing/latest/classic/ x-forwarded-headers.html
في ملف httpd.conf:
<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
</VirtualHost>
أو في ملف htaccess الجذر الخاص بك:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
المكافأة: لن تحاول إعادة توجيه حركة مرور http على جهاز التطوير المحلي.