Apache 2.4 membatasi URL ke IP tertentu

13

Saya mencoba membatasi URL tertentu agar tersedia di luar jaringan hanya untuk alamat IP tertentu. Ketika pengguna di luar mencoba mengakses URL itu dan bukan dari daftar IP, ia harus diarahkan ke beranda.

Inilah yang saya coba sejauh ini tanpa hasil. Bagian terakhir ini mengarahkan semua orang ke beranda tanpa memandang IP.

<Location "/secret">
#    <If "%{REMOTE_ADDR} != -ipmatch '123.123.123.123/255.255.255.255'">
#    Redirect 303 "/secret" /
#    </If>

RewriteCond "%{REMOTE_ADDR}" "!123\.123\.123\.123"
RewriteRule .* / [R,L]

LogLevel debug rewrite:trace6
</Location>

PS: URL / rahasia sebenarnya adalah URL virtual dan tidak ada secara fisik di drive.

Denis Rendler
sumber
pernyataan If dikomentari? Aktifkan penulisan ulang - RewriteEngine On?
user9517
Pernyataan <If> adalah salah satu versi yang saya coba. Arahan RewriteEngine On dinyatakan sebelumnya. Itulah alasannya mengarahkan semua orang
Denis Rendler
1
Saya pikir Anda harus menghapus tanda pada jawaban yang dipilih, karena itu tidak valid untuk Apache 2.4 seperti yang Anda minta (ini memberikan informasi yang salah kepada orang-orang yang lewat)
Erenor Paz

Jawaban:

3

Gunakan Order, Denydan allowuntuk menentukan siapa yang memiliki akses ke vhost atau lokasi Anda.

<VirtualHost *:80>
    ServerName example.net
    DocumentRoot /docroot

    <Directory "/docroot">
        Order Deny,Allow
        Deny from all
        Allow from 10.10.10.10
        Allow from 10.10.11.0/24
    </Directory>   
</VirtualHost>

Ketika datang untuk mengarahkan, pikirkan tentang halaman kesalahan khusus . Ini jauh lebih umum, karena setiap akses yang tidak sah harus memprovokasi kesalahan 403 dan dengan demikian dapat dievaluasi dengan mudah.

Saya tidak pernah melakukan ini dengan apache, tetapi gunakan strategie ini dengan nginx. Untuk apache, hal seperti ini harus dilakukan:

ErrorDocument 403 http://homepage.example.com

Dokumen kesalahan khusus dikonfigurasikan menggunakan direktif ErrorDocument, yang dapat digunakan dalam konteks global, virtualhost, atau direktori. Ini dapat digunakan dalam file .htaccess jika AllowOverride diatur ke FileInfo. (dari dokumen apache)

ansi_lumen
sumber
2
Ini terlihat seperti seperangkat konfigurasi Apache httpd 2.2. Apakah masih akan bekerja dengan 2.4?
user9517
Paling tidak ErrorDocumentbagiannya dari 2.4 docs. Saya tidak menggunakan apache, karena nginx ada, tetapi mengasumsikan itu Order, Denydan Allowmasih ada di apache 2.4
ansi_lumen
Terima kasih, tetapi saya tidak membantu. Saya lupa menyebutkan, tetapi saya memperbarui pertanyaan, URL / rahasia sebenarnya adalah URL virtual dan tidak ada secara fisik di drive. URL itu sendiri adalah penulisan ulang dari index.php itu sebabnya saya menggunakan arahan <Lokasi>.
Denis Rendler
4
Sintaks ini tidak digunakan lagi dalam apache 2.4
Luca Reghellin
1
Mengapa ini jawaban yang diterima? Ini untuk Apache 2.2 bukan 2.4 karena pertanyaannya menyiratkan ... Ini tidak akan berfungsi.
Jeremy
22

Opsi Pesanan, Tolak, dan Bolehkan telah diganti di Apache 2.4 dengan

<Directory /var/www/mysite.com/htdocs/public>
    Require all granted
</Directory>

Anda dapat secara eksplisit membatasi alamat melalui penggunaan berikut ini:

<Directory /var/www/mysite.com/htdocs/public>
    Require all granted
    Require not ip 192.168.0.1
</Directory>

Kebalikannya juga benar, untuk membatasi semua dan hanya mengizinkan sub-set gunakan yang berikut ini:

<Directory /var/www/mysite.com/htdocs/public>
    Require host example.com
    Require ip 192.168.0.1
</Directory>

Informasi lebih lanjut tersedia di dokumentasi kontrol akses Apache 2.4.

Sehubungan dengan pertanyaan Anda (diedit sendiri karena kurangnya poin untuk menambahkan komentar,) Anda harus dapat dengan mudah menetapkan ErrorDocument dengan indeks ditetapkan sebagai jalur URL:

<Directory /var/www/mysite.com/htdocs/public>
    Require host example.com
    Require ip 192.168.0.1
    ErrorDocument 401 /index.html
</Directory>

Semoga ini membantu!

Linztm
sumber
Terima kasih, @Linztm! Tetapi ini hanya memecahkan sebagian masalah saya. Saya tidak ingin hanya memblokir pengguna tetapi juga mengarahkannya ke beranda.
Denis Rendler
Tampaknya berfungsi dengan direktif ErrorDocument hanya jika saya memberikan URL lengkap termasuk domain dan protokol. Saya akan meneliti lebih lanjut. Terima kasih.
Denis Rendler
Saya menemukan setidaknya satu kasus ketika Anda perlu menggunakan allowmeskipun sudah usang, Require 127.0.0.1 masih memungkinkan akses dengan alamat eksternal dari mesin lokal, di mana sebagai memungkinkan sintaks hanya mengizinkan dari 127 alamat.
Alexei Martianov
2

Untuk Apache 2.4, Anda dapat menggunakan <RequireAny>. Anda dapat melakukannya di vhost atau file .htaccess ....

SetEnvIF IP xxx.xxx.xxx.xxx AllowThisIP  # Or X-Real-IP
SetEnvIF IP yyy.yyy.yyy.yyy AllowThisIP
<RequireAny>
  Require env AllowThisIP
  Require host example.com
</RequireAny>

Apache docs https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#requireany

MontyThreeCard
sumber