Score:1

จะใช้ Mod Rewrite เพื่อเข้าถึงไฟล์โฟลเดอร์ที่ไม่ใช่เอกสารรูทได้อย่างไร?

ธง tr

ฉันมีโครงสร้างต่อไปนี้สำหรับรหัสเว็บไซต์ของฉันที่ /var/www/html

-- ไฟล์
---- ทดสอบ. txt

-- แอป
---- SomePhpCodes.php
---- SomePhpCodes.php

-- สาธารณะ
----index.php
---- .htaccess

รูทเอกสารถูกตั้งค่าเป็น "/var/www/html/public" แต่ฉันต้องการให้เข้าถึงไฟล์ผ่านพาธ "http://mywebsite/files/test.txt" ด้วย

ฉันคิดว่าสิ่งนี้จะต้องเป็นไปได้โดยใช้ mod_rewrite ในไฟล์ .htaccess ไฟล์ข้างใน สาธารณะ แต่ฉันกำลังดิ้นรนที่จะทำเช่นนั้น

ฉันพยายามเพิ่มกฎให้กับค่าเริ่มต้น .htaccess ที่ให้บริการโดย Laravel framework ปัจจุบัน .htaccess มีลักษณะดังต่อไปนี้:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # The following rule is added by me
    RewriteRule files/(.*\.txt) /var/www/html/files/$1 [L]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

ผลลัพธ์ปัจจุบันคือ ข้อผิดพลาดภายในเซิร์ฟเวอร์ เมื่อพยายามเข้าถึง "http://mywebsite/files/test.txt" ฉันรู้สึกว่าฉันอาจพลาดการตั้งค่าบางอย่างในการทำให้โฟลเดอร์ "ไฟล์" เป็นสาธารณะ แต่ฉันไม่รู้ว่าต้องทำอย่างไร

ฉันติดอยู่และถ้าใครสามารถช่วยฉันได้ฉันจะขอบคุณ

Score:2
ธง jp

คุณสามารถสร้างสัญลักษณ์เชื่อมโยง

ln -s /var/www/html/files /var/www/html/public/files

คุณจะต้องการ ตัวเลือก +FollowSymLinks เพื่อให้สิ่งนี้ใช้งานได้ โปรดทราบว่าตัวเลือกนี้เพิ่มความเสี่ยงด้านความปลอดภัยเนื่องจากอนุญาตให้เข้าถึงไฟล์ภายนอก DocumentRoot.

หรือคุณสามารถเพิ่ม นามแฝง /files /var/www/html/files ของคุณ โฮสต์เสมือน การกำหนดค่าสำหรับไซต์นี้ เป็นตัวเลือกที่ปลอดภัยกว่า แต่คุณไม่สามารถทำได้ .htaccess.

Score:1
ธง kz

นอกจากคำตอบของ @AlexD แล้ว...

คิดว่าสิ่งนี้จะต้องเป็นไปได้โดยใช้ mod_rewrite ในไฟล์ .htaccess ไฟล์

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

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

อย่างไรก็ตาม นี่ไม่ใช่สาเหตุของคุณ ข้อผิดพลาดภายในเซิร์ฟเวอร์...

ไฟล์ RewriteRule/(.*\.txt) /var/www/html/files/$1 [L]

นี่อาจส่งผลให้เกิดการวนซ้ำการเขียนซ้ำ (ดังนั้น 500 Internal Server Error response) เนื่องจากไม่ได้ยึด เขียนกฎใหม่ ลวดลาย ยังตรงกับ การแทน สตริง (เส้นทาง URL ญาติรูท) ดังนั้นเส้นทาง URL ที่เขียนใหม่จึงถูกเขียนใหม่ครั้งแล้วครั้งเล่า...

ใน เซิร์ฟเวอร์ บริบท คุณสามารถเขียนได้ดังนี้:

RewriteRule ^/files/(.+\.txt)$ /var/www/html/files/$1 [L]

(หากคุณไม่ต้องการไดเร็กทอรีย่อยของ /ไฟล์ ไดเร็กทอรี ดังนั้น regex ควรจำกัดมากขึ้น เช่น ([^/]+\.txt))

โพสต์คำตอบ

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