ปฏิเสธทั้งหมดอนุญาตเพียงหนึ่ง IP ผ่าน htaccess


156

ฉันกำลังพยายามปฏิเสธทั้งหมดและอนุญาตสำหรับ IP เดียวเท่านั้น แต่ฉันต้องการให้ htaccess ต่อไปนี้ใช้งานได้กับ IP เดียว ฉันไม่ได้หาวิธีที่จะทำงานทั้งสอง: ปฏิเสธทั้งหมดและอนุญาตเพียงหนึ่งเดียวบวกตัวเลือกต่อไปนี้

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    #Removes access to the system folder by users.
    #Additionally this will allow you to create a System.php controller,
    #previously this would not have been possible.
    #'system' can be replaced if you have renamed your system folder.
    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    #When your application folder isn't in the system folder
    #This snippet prevents user access to the application folder
    #Submitted by: Fabdrol
    #Rename 'application' to your applications folder name.
    RewriteCond %{REQUEST_URI} ^application.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    #Checks to see if the user is attempting to access a valid file,
    #such as an image or css document, if this isn't true it sends the
    #request to index.php
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>

<IfModule !mod_rewrite.c>
    # If we don't have mod_rewrite installed, all 404's
    # can be sent to index.php, and everything works as normal.
    # Submitted by: ElliotHaughin

    ErrorDocument 404 /index.php
</IfModule>

มีวิธีที่จะทำให้งานนี้หรือไม่?

คำตอบ:


356
order deny,allow
deny from all
allow from <your ip> 

95
บันทึก! Apache มีความอ่อนไหวต่อช่องว่างใน htaccess ไม่อนุญาตให้มีช่องว่างระหว่างปฏิเสธอนุญาต คือไม่เขียนคำสั่งปฏิเสธอนุญาต
H.Rabiee

2
ข้อมูล: - มันใช้งานได้กับ IPv6 ด้วย! เพียงเพิ่มอีกบรรทัดด้วยallow from yourIPv6
jave.web

เป็นไปได้ใน nginx?
shgnInc

10
หมายเหตุเกี่ยวกับ 2.4 เอกสาร : คำสั่งอนุญาต, ปฏิเสธและคำสั่งที่จัดทำโดย mod_access_compat จะถูกคัดค้านและจะหายไปในรุ่นอนาคต คุณควรหลีกเลี่ยงการใช้และหลีกเลี่ยงการใช้บทเรียนที่ล้าสมัยแนะนำให้ใช้
Martin Schneider

4
ดังที่ @ MA-Maddin ชี้ให้เห็น - จากนั้น mod_access_compat จะถูกปฏิเสธ โพสต์นี้แสดงวิธีการทำในเวอร์ชันที่ใหม่กว่า และหนึ่งควรพิจารณาถ้าเซิร์ฟเวอร์ใช้พร็อกซีเนื่องจากจะแสดง proxy-IP สำหรับผู้เยี่ยมชม โพสต์นี้แนะนำวิธีแก้ไข
Zeth

115

ฉันรู้ว่าคำถามนี้มีคำตอบที่ยอมรับแล้ว แต่เอกสาร Apacheบอกว่า:

คำสั่งอนุญาต, ปฏิเสธและสั่งให้โดย mod_access_compat จะเลิกใช้แล้วและจะหายไปในรุ่นอนาคต คุณควรหลีกเลี่ยงการใช้และหลีกเลี่ยงการใช้บทเรียนที่ล้าสมัยแนะนำให้ใช้

ดังนั้นคำตอบที่พิสูจน์ได้ในอนาคตจะเป็นดังนี้:

<RequireAll>
    Require ip xx.xx.xx.xx yy.yy.yy.yy
</RequireAll>

หวังว่าฉันได้ช่วยป้องกันหน้านี้จากการเป็นหนึ่งใน "บทเรียนเก่า ๆ " :)


เราจะใส่ IP ของเราที่ไหน
Gary Carlyle Cook

1
ทางที่จะไป! วิธีนี้ควรได้รับการยอมรับเนื่องจากไม่เพียง แต่ทำงานได้ดีเท่านั้น
6opko

คำตอบอื่น ๆ ไม่ได้ช่วยในสถานการณ์ของฉัน แต่อันนี้ก็ทำ ขอขอบคุณที่อัปเดตเธรดเก่า
Johann Dyck

1
ตัวอย่างคำตอบนี้อนุญาตให้เข้าถึงได้จากสอง IP ดังนั้นเพื่อเพิ่ม IP หลาย ๆ ตัวเราแค่ใส่ช่องว่างระหว่างมัน คุณสามารถใส่Require ipหลายบรรทัดเพื่อให้ผู้ใช้อ่านได้มากขึ้นหรือ IP ทั้งหมดต้องอยู่ในบรรทัดเดียวหรือไม่?
Hastig Zusammenstellen

หากคุณใช้สิ่งนี้คุณจะเปลี่ยนเส้นทางไปยังหน้าเว็บชั่วคราวตามที่คำตอบบางคำตอบได้อย่างไร
rudtek

39

สิ่งนี้สามารถปรับปรุงได้โดยใช้คำสั่งที่ออกแบบมาสำหรับงานนั้น

ErrorDocument 403 /specific_page.html
Order Allow,Deny
Allow from 111.222.333.444

โดยที่ 111.222.333.444 เป็นที่อยู่ IP แบบคงที่ของคุณ

เมื่อใช้คำสั่ง "อนุญาตให้สั่งปฏิเสธ" คำขอต้องตรงกับอนุญาตหรือปฏิเสธหากไม่ตรงตามคำขอจะถูกปฏิเสธ

http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html#order


1
วิธีเพิ่ม uRL ที่กำหนดเอง
secondight

32

เวอร์ชันด้านบนที่ได้รับการแก้ไขเล็กน้อยรวมถึงหน้าเว็บที่กำหนดเองที่จะแสดงต่อผู้ที่ปฏิเสธการเข้าถึง:

ErrorDocument 403 /specific_page.html
order deny,allow
deny from all
allow from 111.222.333.444

... และวิธีการที่คำขอเหล่านั้นไม่ได้มาจาก 111.222.333.444 จะเห็น specific_page.html

(การโพสต์สิ่งนี้เป็นความคิดเห็นดูแย่มากเพราะบรรทัดใหม่หายไป)


สวัสดี ฉันมีรหัสเดียวกันกับที่คุณมีใน. htaccess ของฉัน แต่ฉันได้รับข้อผิดพลาด 500 ครั้ง ผมหน้าเว็บที่ระบุเรียกว่าและที่อยู่ในโฟลเดอร์เดียวกันกับtest.html .htaccessอย่างไรก็ตามฉันไม่เห็นบันทึก (ไม่ได้รับอนุญาตจากเซิร์ฟเวอร์) คุณมีความคิดไหมว่าทำไมฉันถึงมีปัญหานั้น? เมื่อฉันได้รับเส้นทางของไฟล์ผ่านทางไคลเอนต์ ftp มันจะบอกฉัน/test.htmlว่าเส้นทางนั้นไม่ควรมีปัญหาใช่มั้ย
Musterknabe

นอกจากนี้ข้อผิดพลาด 500 ยังเกิดขึ้นแม้ว่าฉันจะมีบรรทัดที่ errordocument แสดงความคิดเห็น นั่นไม่ควรเป็นปัญหา มีเหตุผลอีก 3 บรรทัดที่ใช้งานไม่ได้ใช่ไหม ใน. htaccess ของฉันฉันมีอีกสามบรรทัดที่ฉันเปลี่ยนเส้นทางไม่ใช่ www ไปยัง www แต่นั่นคือ แต่ฉันยังได้รับข้อผิดพลาดเมื่อฉันมีเพียงสามบรรทัดด้วยการปฏิเสธอนุญาต ฯลฯ
Musterknabe

จะเพิ่ม URL ที่กำหนดเองได้อย่างไร
secondight

8

การปรับปรุงคำตอบก่อนหน้าอีกเล็กน้อยหน้าการบำรุงรักษาสามารถแสดงต่อผู้ใช้ของคุณในขณะที่คุณทำการเปลี่ยนแปลงเว็บไซต์:

ErrorDocument 403 /maintenance.html
Order Allow,Deny
Allow from #.#.#.#

ที่ไหน:


เมื่อฉันใช้ ErrorDocument 403 ฉันได้รับข้อผิดพลาด 403 เพิ่มเติมสำหรับไฟล์ maintenance.html นั้นเนื่องจากไม่สามารถเข้าถึงไฟล์นั้นไม่ได้ คุณมีทางออกสำหรับสิ่งนั้นหรือไม่?
Zdravko Donev

3

นอกเหนือจากคำตอบของ @David Brown หากคุณต้องการปิดกั้น IP คุณต้องอนุญาตทั้งหมดก่อนแล้วจึงปิดกั้น IP ดังกล่าว:

    <RequireAll>
      Require all granted
      Require not ip 10.0.0.0/255.0.0.0
      Require not ip 172.16.0.0/12
      Require not ip 192.168
    </RequireAll>

First line allows all
Second line blocks from 10.0.0.0 to 10.255.255.255
Third line blocks from 172.16.0.0 to 172.31.255.255
Fourth line blocks from 192.168.0.0 to 192.168.255.255

คุณสามารถใช้สัญลักษณ์ใด ๆ ที่กล่าวถึงข้างต้นเพื่อให้เหมาะกับความต้องการของ CIDR ของคุณ


ขอบคุณนี่เป็นวิธีที่เหมาะสมในการจัดการกับ Apache 2.4!
Aleksandar Pavić

2

คุณสามารถใช้สิ่งต่อไปนี้ใน htaccess เพื่ออนุญาตและปฏิเสธการเข้าถึงไซต์ของคุณ:

SetEnvIf remote_addr ^1\.2\3\.4\.5$ allowedip=1

Order deny,allow
deny from all
allow from env=allowedip

ครั้งแรกที่เราตั้งค่าตัวแปร env allowedipหากที่อยู่ของลูกค้า IP ตรงกับรูปแบบที่ถ้ารูปแบบตรงแล้วตัวแปร env allowedipถูกกำหนดค่า1

ในขั้นตอนต่อไปเราใช้อนุญาตปฏิเสธคำสั่งเพื่ออนุญาตและปฏิเสธการเข้าถึงไซต์ Order deny,allowหมายถึงคำสั่งของและdeny บรรทัดนี้บอกให้เซิร์ฟเวอร์ปฏิเสธทุกคน บรรทัดสุดท้าย อนุญาตให้เข้าถึงที่อยู่ IP เดียวที่เราตั้งค่าตัวแปร envallowdeny from allallow from env=allowedip

แทนที่1\.2\.3\.4\.5ด้วยที่อยู่ IP ที่คุณอนุญาต

อ้างอิง:


1
อะไรคือข้อดีของการใช้สิ่งนี้แทนที่จะอนุญาตให้ใช้จาก 324.234.22.1
Berry M.

2

ฉันไม่สามารถใช้วิธี 403 เพราะฉันต้องการหน้าการบำรุงรักษาและภาพหน้าในโฟลเดอร์ย่อยบนเซิร์ฟเวอร์ของฉันดังนั้นใช้วิธีการต่อไปนี้เพื่อเปลี่ยนเส้นทางไปยัง 'หน้าการบำรุงรักษา' สำหรับทุกคนยกเว้น IP เดียว *

RewriteEngine on
RewriteCond %{REMOTE_ADDR} !**.**.**.*
RewriteRule !^maintenance/ http://www.website.co.uk/maintenance/ [R=302,L]

ที่มา: การสร้างหน้าโฮลดิ้งเพื่อซ่อนบล็อก WordPress ของคุณ


วิธีนี้เป็นวิธีที่ง่ายที่สุด - ฉันชอบมันมาก
Gerfried

1

คุณสามารถมีมากกว่าหนึ่ง IP หรือแม้กระทั่งการอนุญาตอื่น ๆ เช่นผู้ใช้ชื่อโฮสต์ ... ข้อมูลเพิ่มเติมที่นี่https://www.askapache.com/htaccess/setenvif/

SetEnvIf remote_addr ^123.123.123.1$ allowedip=1
SetEnvIf remote_addr ^123.123.123.2$ allowedip=1
SetEnvIf remote_addr ^123.123.123.3$ allowedip=1
SetEnvIf remote_addr ^123.123.123.4$ allowedip=1

Order deny,allow
deny from all
allow from env=allowedip

0

หากคุณต้องการใช้ mod_rewrite สำหรับการควบคุมการเข้าถึงคุณสามารถใช้เงื่อนไขเช่นตัวแทนผู้ใช้อ้างอิง http, addr ระยะไกล ฯลฯ

ตัวอย่าง

RewriteCond %{REMOTE_ADDR} !=*.*.*.* #you ip address
RewriteRule ^$ - [F]

refrences:


0

เพิ่มคำสั่งต่อไปนี้ในไฟล์. htaccess และวางไฟล์นั้นไว้ในโฟลเดอร์ htdocs ของคุณ

Order Deny,Allow
Deny from all
Allow from <your ip> 
Allow from <another ip> 

0
ErrorDocument 403 /maintenance.html
Order Allow,Deny
Allow from #:#:#:#:#:#

สำหรับฉันดูเหมือนว่าจะใช้งานได้ (การใช้ IPv6 มากกว่า IPv4) ฉันไม่รู้ว่านี่จะแตกต่างกันไปสำหรับบางเว็บไซต์หรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.