Score:1

วิธีปฏิเสธการเข้าถึงทั้งหมด ยกเว้น IP เดียว และอนุญาตการเข้าถึง URI เฉพาะสำหรับทุกคนด้วย Apache 2.4

ธง cz

ฉันต้องบล็อกการเข้าถึงไซต์จากสาธารณะ แต่อนุญาตให้มีที่อยู่ IP หนึ่งที่อยู่ และฉันต้องให้สิทธิ์การเข้าถึงแก่ URI-s สองแห่งสำหรับสาธารณะ แต่ไม่มีอะไรทำงาน - ทั้งหมดถูกบล็อกหรือทั้งหมดเปิดอยู่

แยกอย่างง่ายจาก Apache conf:

<Directory /site/dir>
    Require ip 1.2.3.4
</Directory>

<Location "/open/for/public1">
    Require all granted
</Location>
<Location "/open/for/public2">
    Require all granted
</Location>

ตอนนี้ทั้งหมดถูกบล็อก

ลองด้วยไวยากรณ์เก่าด้วย:

<Location "/open/for/public1">
    Order allow,deny
    allow from all
</Location>

ยังเหมือนเดิม.

ฉันได้ลองบล็อกไซต์ด้วยคำสั่ง <Location "/"> (แทนคำสั่ง <Directory>) แต่ public1 และ public2 ก็ถูกบล็อกเช่นกัน

ฉันได้ลองด้วย:

SetEnvIf Request_URI "^/open/for/public1$" NO_AUTH_NEEDED=1
<ไดเร็กทอรี /site/dir>
    สั่งซื้อปฏิเสธอนุญาต
    ปฏิเสธจากทั้งหมด
    อนุญาตจาก env=NO_AUTH_NEEDED
    อนุญาตจาก 1.2.3.4
</ไดเร็กทอรี>

ใช้งานไม่ได้ บล็อกทั้งหมด

ข้อเสนอแนะทั้งหมดยินดีต้อนรับ

Chris avatar
it flag
* ฉันได้ลองบล็อกไซต์ด้วย คำสั่ง (แทน คำสั่ง) แต่จากนั้น public1 และ public2 ก็ถูกบล็อกด้วย* ฉันเพิ่งทดสอบวิธีแรกด้วยบล็อก 'ตำแหน่ง' 3 บล็อกแทนที่จะเป็น 'ไดเรกทอรี' เช่นเดียวกับวิธีแรก และได้ผล ฉันถูกบล็อกทุกที่ยกเว้นตำแหน่งที่ฉันกำหนดไว้
goldie avatar
cz flag
@Chris ขอบคุณที่รับชม ลองอีกครั้งยังคงถูกบล็อกทั้งหมด อาจจะเป็นคำสั่งของคำสั่ง? คุณช่วยโพสต์ conf ของคุณได้ไหม
Score:1
ธง cz

ในที่สุดสิ่งที่ช่วยฉันได้คือกฎ Apache Rewrite และ เขียนการแจ้งเตือน LogLevel:trace6. ในกรณีนี้ ดูเหมือนว่านอกเหนือจากไฟล์ .htaccess บางไฟล์ (ฉันไม่คิดว่าจะมีผลกระทบใดๆ) มีการเปลี่ยนเส้นทางภายในโค้ดด้วย ดังนั้นฉันจึงใช้ในส่วน VirtualHost เช่น:

RewriteCond %{REMOTE_ADDR} !1.2.3.4
RewriteCond %{REQUEST_URI} !^/open/for/public(.*) [NC]
กฎการเขียนซ้ำ* - [F]

และใน .htaccess:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
กฎการเขียนซ้ำ index.php [จบ]

ฉันเพิ่มที่ [จบ] และดูเหมือนว่ามันสำคัญมาก เพราะหากไม่มีเครื่องยนต์ Rewrite ก็ยังคงดำเนินต่อไป และด้วยเหตุผลบางประการ ด้วยการเปลี่ยนเส้นทางภายใน (จากบันทึกของ Apache: ...การเปลี่ยนเส้นทางภายในด้วย /index.php [INTERNAL REDIRECT]) URL เสียหายและ กฎการเขียนซ้ำ - [F]* ยิงทุกครั้ง

Score:0
ธง it

ในตัวอย่างแรก ฉันคิดว่าคุณถูกบล็อกเพราะ ไดเรกทอรี คำสั่งใช้เวลามากกว่า ที่ตั้ง คำสั่ง:

<Directory /site/dir>
    Require ip 1.2.3.4
</Directory>

<Location "/open/for/public1">
    Require all granted
</Location>

<Location "/open/for/public2">
    Require all granted
</Location>

มีหลายวิธีในการบรรลุสิ่งที่คุณต้องการ

  • วิธีแรกที่ได้ผลสำหรับฉันคือการใช้ ที่ตั้ง คำสั่งเท่านั้น (ทดสอบกับ IP จริงและข้อเท็จจริง, URL สาธารณะเป็นไฟล์จริงในระบบของฉัน):

      DocumentRoot /site/dir
    
      <สถานที่ />
          ต้องการไอพี 1.2.3.4
      </สถานที่
    
      <ตำแหน่งที่ตั้ง "/open/for/public1">
          ต้องได้รับอนุญาตทั้งหมด
      </สถานที่>
    
      <ตำแหน่งที่ตั้ง "/open/for/public2">
          ต้องได้รับอนุญาตทั้งหมด
      </สถานที่>
    

    กับ ที่ตั้ง คำสั่ง คำสั่งไม่สำคัญ. ในตัวอย่างต่อไปนี้ ฉันถูกบล็อกทุกที่เพราะบล็อกสุดท้ายทับบล็อกอื่นๆ:

      <ตำแหน่งที่ตั้ง "/open/for/public1">
          ต้องได้รับอนุญาตทั้งหมด
      </สถานที่>
    
      <ตำแหน่งที่ตั้ง "/open/for/public2">
          ต้องได้รับอนุญาตทั้งหมด
      </สถานที่>
    
      <สถานที่ />
          ต้องการไอพี 1.2.3.4
      </สถานที่
    
  • ฉันยังทดสอบโดยใช้ ไดเรกทอรี คำสั่ง ในกรณีนี้, คำสั่งไม่สำคัญ (คำสั่งจะใช้ตามลำดับการจับคู่ที่สั้นที่สุดก่อน)

      <Directory /site/dir>
          Require ip 1.2.3.4
      </Directory>
    
      <Directory "/site/dir/open/for/public1">
          Require all granted
      </Location>
    
     <Directory "/site/dir/open/for/public2">
         Require all granted
     </Directory >
    

    ให้เลือกระหว่าง ไดเรกทอรี หรือ ที่ตั้ง คำแนะนำดู คำแนะนำ apache.

  • นี่เป็นอีกตัวอย่างที่ทดสอบโดยใช้ mod_rewrite:

      <Directory /var/www/site/>
    
          # first, allow all 
          Require all granted
    
          # Then enable rewrite engine   
          RewriteEngine On
    
          # Requests that: 
          # do not start with 'test' (test is a real folder supposed open to public)
          RewriteCond %{REQUEST_URI} !^/test
    
          # AND that do not start with 'another_test'
          RewriteCond %{REQUEST_URI} !^/another_test
    
          # AND ...
    
          # AND that do not come from given IP
          RewriteCond "%{REMOTE_ADDR}"  !1.2.3.4
    
          # are blocked (403 Forbidden)
          RewriteRule .* - [F]
      </Directory>
    
goldie avatar
cz flag
ขอบคุณที่ชี้ฉันไปในทิศทางที่ถูกต้อง! หลังจากเอาหัวโขกกำแพงมาหลายวัน (!) ฉันตัดสินใจลองใช้กฎ Rewrite และ LogLevel alert rewrite:trace6 และดูเหมือนว่านอกเหนือจากไฟล์ .htaccess ที่ดูขี้ขลาดแล้ว ยังมีการเปลี่ยนเส้นทางภายในในโค้ดอีกด้วย ดังนั้นฉันจึงใช้สิ่งที่ชอบ: * RewriteCond %{REMOTE_ADDR} !1.2.3.4 RewriteCond %{REQUEST_URI} !^/open/for/public(.*) [NC] RewriteRule .* - [F,END]

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา