it-swarm.asia

كيفية إعادة توجيه جميع طلبات HTTP إلى HTTPS

أحاول إعادة توجيه جميع طلبات HTTP غير الآمنة على موقعي (مثل http://www.example.com) إلى HTTPS (https://www.example.com). أنا أستخدم PHP راجع للشغل. هل يمكنني القيام بذلك في. htaccess؟

266
Cat

التحديث: على الرغم من أن هذه الإجابة قد قبلت منذ بضع سنوات ، لاحظ أن النهج الذي تتبعه يوصى به الآن ضد بواسطة وثائق Apache. استخدم Redirect بدلاً من ذلك. انظر هذه الإجابة .


RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}

المصدر

273
Reese Moore

مستندات 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 كما طلب في السؤال.

ربما لم تظهر هذه المقالة إلا بعد طرح السؤال والإجابة عليه ، ولكن يبدو أنها الطريقة الحالية للذهاب.

315
ssc

أوصي بإعادة توجيه 301:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
126
David

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

المشكلة هي أنه إذا كان هناك رابط أو نموذج على موقع HTTPS يجعل العميل يرسل طلبًا إلى موقع HTTP ، فسيظهر محتواه قبل إعادة التوجيه.

على سبيل المثال ، إذا كانت إحدى صفحاتك المعروضة على HTTPS تحتوي على نموذج يقول <form action="http://example.com/doSomething"> ويرسل بعض البيانات التي لا ينبغي إرسالها بشكل واضح ، فسيرسل المتصفح أولاً الطلب الكامل (بما في ذلك الكيان ، إذا كان POST) إلى HTTP الموقع أولا. سيتم إرسال إعادة التوجيه على الفور إلى المتصفح ، وبما أن عددًا كبيرًا من المستخدمين يعطلون أو يتجاهلون التحذيرات ، فمن المحتمل أن يتم تجاهلها.

بطبيعة الحال ، قد يتسبب خطأ توفير الارتباطات التي يجب أن تكون لموقع HTTPS ولكن ينتهي بها الأمر بالنسبة لموقع HTTP في حدوث مشاكل بمجرد حصولك على شيء يستمع على منفذ HTTP على نفس عنوان IP الخاص بموقع HTTPS. ومع ذلك ، أعتقد أن الاحتفاظ بالموقعين "كمرآة" يزيد فقط من فرص ارتكاب الأخطاء ، حيث قد تميل إلى افتراض أنه سيصحح نفسه تلقائيًا عن طريق إعادة توجيه المستخدم إلى HTTPS ، في حين أن الوقت متأخر جدًا. (كانت هناك مناقشات مماثلة في هذا السؤال )

34
Bruno

لقد وجدت أن أفضل طريقة لـ https و www على المجال هي

RewriteCond %{HTTPS} off 
RewriteCond %{HTTPS_Host} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
17
GiorgosK

هذا هو نهج إعادة توجيه 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

13
Timothy Nwanwene

يعجبني طريقة إعادة التوجيه هذه من http إلى https. لأنني لست بحاجة إلى تعديله لكل موقع.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R,L]
8
Cory

باستخدام التعليمات البرمجية التالية في ملف htaccess الخاص بك ، يعيد توجيه الزائرين تلقائيًا إلى نسخة HTTPS من موقعك:

RewriteEngine On

RewriteCond %{HTTPS} off

RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

إذا كان لديك ملف htaccess موجود:

لا تكرر RewriteEngine في.

تأكد من أن الأسطر التي تبدأ RewriteCond و RewriteRule تتبع مباشرة RewriteEngine On الموجودة بالفعل.

6
OpenWebWar

هذه هي الطريقة المناسبة لإعادة توجيه 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

5
AnarchyOutlaw

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

إذا كنت تعمل مع خادم الويب 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']); 
} 
5
maikel

افعل كل ما هو موضح أعلاه لإعادة التوجيه. فقط أضف "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

4
Waqas

أضف التعليمات البرمجية التالية إلى ملف. 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]
4
Rahul

لإعادة توجيه جميع طلبات 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>
2
starkeen

إذا كنت في موقف لا تستطيع فيه الوصول إلى تهيئة 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 يوصي بعدم استخدام هذه الطريقة حيثما كان ذلك ممكنًا. ومع ذلك ، يستغرق الأمر مجرد فحص إضافي في نهاية التطوير للتأكد من أن بيانات المستخدم آمنة. نأمل أن يساعد هذا شخصًا آخر قد يضطر إلى النظر في استخدام طرق غير مستحسنة بسبب القيود المفروضة على خدمات الاستضافة لدينا.

2
F. Scott Gale

من خلال. 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]

أيضا ، راجع هذا لمزيد من التفاصيل. كيفية إعادة توجيه المتشعب إلى المتشعب؟

1
Roshan Padole

ما لم تكن بحاجة إلى 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/ (موقع أعمل عليه).

1
SashaK

إذا كنت تستخدم Apache ، فإن mod_rewrite هو الحل الأسهل ولديه الكثير من الوثائق عبر الإنترنت حول كيفية القيام بذلك. على سبيل المثال: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html

0
vcsjones

هناك حافة مختلفة لهذه المشكلة عندما يتم تشغيل Load Balancer.

الموقف كالتالي: - حركة المرور من المستعرض إلى Load Balancer والعودة هي (يجب أن تكون) HTTPS - حركة المرور بين Load Balancer و WebServer الفعلي هي HTTP.

لذلك ، تظهر جميع متغيرات طلب الخادم في PHPأو Apache أن الاتصال هو مجرد HTTP. والدلائل HTTP و HTTPS على الخادم هي نفسها.

لا يعمل RewriteCondition في الإجابة المعتمدة. أنه يعطي حلقة أو أنه لا يعمل فقط.

السؤال هو: كيفية الحصول على هذا العمل على Load Balancer.

(أو تم تكوين Load Balancer بشكل خاطئ. وهذا ما آمله لأنه بعد ذلك يمكنني نقل المشكلة إلى شركة WebHosting :-))

0
BertC

خذ هذا الرمز إليك .htaccess file إعادة توجيه HTTP إلى HTTPS تلقائيًا

RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

0
Ehsan Sattari

إنه يعمل لي:

<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

0
Intacto
 Redirect 301 / https://example.com/

(عملت لي عندما لم تنجح الإجابات المذكورة أعلاه)

علاوة:

ServerAlias www.example.com example.com

(https ثابت: // www . example.com غير موجود)

0
aalesund

لقد وجدت طريقة لإجبار جميع صفحات موقعي على إعادة التوجيه من http إلى تمثيلي الصفحات على https التي تناسبني.

RewriteEngine On 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
0
Oleg Apanovich

إذا كنت تستخدم 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 على جهاز التطوير المحلي.

0
ScottyB