Batasi Apache hanya mengizinkan akses menggunakan SSL untuk beberapa direktori

34

Saya memiliki server Apache 2.2 dengan sertifikat SSL yang menampung beberapa layanan yang hanya dapat diakses menggunakan SSL.

yaitu: https : //myserver.com/topsecret/ harus diizinkan sementara http : //myserver.com/topsecret/ harus ditolak atau, idealnya, dialihkan ke https. http://myserver.com/public tidak boleh memiliki batasan ini, dan harus bekerja menggunakan http atau https.
Keputusan untuk mengizinkan / menolak http dibuat di direktori tingkat atas, dan memengaruhi semua konten di bawahnya.

Apakah ada arahan yang dapat ditempatkan di konfigurasi Apache untuk membatasi akses dengan cara ini?

DrStalker
sumber

Jawaban:

38

The SSLRequireSSL direktif adalah apa yang Anda cari.

Di dalam Anda <VirtualHost>, atau di tingkat atas jika Anda tidak menggunakan host virtual:

<Directory /topsecret>
  SSLRequireSSL
</Directory>

Atau di .htaccess:

SSLRequireSSL
Thomas
sumber
1
Selamat Datang di Kesalahan Server! Kami benar-benar lebih suka jawaban memiliki konten, bukan petunjuk ke konten. Namun secara teoritis ini dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi. Terima kasih!
Chris S
8
Oke, saya telah memperbarui posting saya yang berumur lima tahun dengan sebuah contoh :)
Thomas
1
Agar adil, 5 tahun atau tidak, alasannya adalah bahwa tautan yang Anda tuju mungkin hilang, membuat jawaban Anda sebagian besar atau sama sekali tidak berguna bagi seseorang yang datang mencari informasi nanti. Jadi saya benar-benar memilih komentar snarky Anda (jujur), tetapi saya juga sepenuhnya setuju bahwa jawabannya harus memiliki beberapa konteks sehingga tetap bermanfaat. Terutama karena itu ditandai sebagai jawaban yang benar.
Craig
Saya tidak berpikir komunitas SO / SF seketat itu hanya tentang tautan dan jawaban "lmgtfy" saat itu. Tapi saya setuju; sunting retroaktif masuk akal kapan saja.
Thomas
Ke file konfigurasi apa saya akan menambahkan pernyataan direktif itu?
dan carter
8

Dalam konfigurasi global Anda dapat menggunakan:

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{HTTPS} !on
   RewriteRule .* https://%{HTTP_HOST}/%{REQUEST_URI} [R=301,L,QSA]
</IfModule>

Anda juga dapat menggunakan file .htaccess di direktori pertama pohon direktori aman:

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{HTTPS} !on
   RewriteRule .* https://%{HTTP_HOST}/%{REQUEST_URI} [R=301,L,QSA]
</IfModule>

Yang terakhir itu juga bisa ditempatkan di dalam direktori directive dalam konfigurasi host global atau virtual.

Chris S
sumber
Mengarahkan HTTP ke HTTPS memberi Anda serangan MiTM jenis tertentu. Hanya hati-hati.
Craig
1

Atau, Anda bisa menggunakan bahasa sisi server untuk melakukan pemrosesan untuk Anda, daripada menggunakan opsi konfigurasi Apache (jika, mungkin, Anda tidak memiliki akses ke konfigurasi server).

Misalnya, dengan PHP:

if (!isset($_SERVER['HTTPS'])) {
  // put your redirect here
  header('Location: http://myserver.com/public');
}

(meskipun hanya perlu diketahui - jika Anda menggunakan ISAPI di Microsoft IIS, jika permintaan tidak dialihkan melalui HTTPS, maka nilai variabel $ _SERVER ['HTTPS'] akan "mati")

Magsol
sumber
1

Seseorang menyebutkan SSLRequireSSL tetapi saya tidak berpikir itu bekerja dengan sendirinya dan saya belum menemukan contoh yang sukses dengannya. Cara yang disarankan adalah https://wiki.apache.org/httpd/RedirectSSL Saya telah menerapkannya dan berfungsi dengan baik!

Robert
sumber
0

Dengan asumsi Anda menggunakan arahan VirtualHost,

Tempatkan direktif Direktori di virtualhost non-ssl yang menolak akses.

Lalu, letakkan direktif Direktori di virtualhost yang memberikan akses ssl.


sumber
0

Saya selalu melakukan mod_rewrite ini dalam file .htaccess, meskipun Anda harus dapat melakukannya dalam file konfigurasi utama Anda juga.

Berikut adalah panduan dengan beberapa cara untuk mewujudkannya: Smart HTTP dan HTTPS RewriteRule Redirects

Jason Wadsworth
sumber