ฉันมีไดเร็กทอรี ( foo/uploads) ซึ่งมี 1 ไฟล์:file1.txt

ฉันได้สร้าง symlink ไปยังไดเร็กทอรีนี้ ( bar/uploads)

นี่คือ.htaccessไฟล์ของฉันภายในbar:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

และนี่คือไฟล์ vhost ของฉัน:

<VirtualHost *:80>
    ServerName bar.com
    DocumentRoot /var/www/bar

    <Directory /var/www/bar>
        allow from all
        order allow,deny
        AllowOverride All
    </Directory>
</VirtualHost>

ปัญหาที่ฉันพบคือ หากฉันพยายามเข้าถึงไฟล์ที่ไม่มีอยู่จริงเมื่อใช้โฟลเดอร์เชื่อมโยงแบบเชื่อมโยง ไฟล์นั้นไม่ตอบสนอง 404 นี่คือสิ่งที่ฉันหมายถึง:

  1. foo.com/uploads/file1.txt-> ไฟล์ที่ให้บริการ (ถูกต้อง)
  2. foo.com/uploads/file2.txt-> บริการ Apache 404 ErrorDocument(ถูกต้อง)
  3. bar.com/uploads/file1.txt-> ไฟล์ที่ให้บริการ (ถูกต้อง)
  4. bar.com/uploads/file2.txt-> ดำเนินการไปที่index.php(ไม่ถูกต้อง)

ฉันได้ลองแล้วรวมถึง:

RewriteCond %{REQUEST_FILENAME} !-l

ก่อนRewriteRuleแต่นั่นไม่ได้สร้างความแตกต่าง

ใครรู้ว่าฉันต้องทำอย่างไร

answer

หากคุณต้องการให้ตัวควบคุมด้านหน้าใช้เมื่อเข้าถึงผ่านbar.comเท่านั้น คุณสามารถตรวจสอบส่วนหัวที่ร้องขอHostในกฎได้ ตัวอย่างเช่น:

RewriteCond %{HTTP_HOST} (^|\.)bar\.com [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

หรือยกเว้น/uploadsไดเรกทอรีย่อย:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^uploads/ index.php [L]

หรือรวม.htaccessไฟล์อื่นใน/uploadsไดเร็กทอรีย่อยที่แทนที่รูปแบบตัวควบคุมด้านหน้าหลัก คุณสามารถทำได้โดยการปิดใช้งาน (หรือเปิดใช้งาน - ไม่ได้เปิดใช้งานการสืบทอด mod_rewrite) เอ็นจิ้นการเขียนซ้ำในไดเร็กทอรีย่อย:

# /uploads/.htaccess
RewriteEngine Off

หรือปิดใช้การ.htaccessแทนที่ทั้งหมดและย้ายคำสั่งเหล่านี้ไปยัง<Directory /var/www/bar>คอนเทนเนอร์ภายในbar.comvHost