ฉันจะให้ Apache ติดตาม symlink ได้อย่างไร


98

ในโฟลเดอร์ apache www ของฉัน ( /var/wwwบน Ubuntu 10.10) ฉันมี:

mydir -> /home/user/mydir

(ที่ฉันสร้างด้วยln -s)

ตอนนี้ถ้าฉันต้องการดูรายชื่อของไฟล์mydirจากเว็บฉันต้องให้อาปาเช่คำสั่งFollowSymLinksใช่ไหม?

แต่ฉันจะวางไว้ที่ไหน? อยู่ใน.htaccessไฟล์? ที่ไหน? ฉันลองหลายวิธี แต่ไม่เข้าใจ ...

นี่คือ/etc/apache2/sites-enabled/000-defaultไฟล์ของฉัน:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks Indexes
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

    Alias /downloads/ "/root/mydir/"
    <Directory "/root/mydir">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>

</VirtualHost>

ฉันยังลองใช้นามแฝงในไฟล์กำหนดค่า .. ยังใช้งานไม่ได้ ..
luca

คำตอบ:


65

มีสองสิ่งที่นี่:

  1. symlinks
  2. รายการไดเรกทอรี

symlinks

สมมติว่า/var/wwwเป็น DocumentRoot ของคุณสำหรับโฮสต์เสมือนเริ่มต้นของคุณคุณควรค้นหาไฟล์กำหนดค่าโฮสต์เสมือนเริ่มต้น (อาจ/etc/apache2/sites-enabled/000-default) และวางไว้ในบล็อกโฮสต์เสมือนนั้นเช่น

<VirtualHost *:80>
    ServerAdmin webmaster@localhost

    DocumentRoot /var/www
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>

หากคุณไม่ได้เปลี่ยนแปลงอะไรเลยตัวเลือกนั้นควรมีอยู่แล้ว

รายการไดเรกทอรี

ในการทำให้ Apache แสดงรายการไฟล์ในไดเรกทอรีคุณต้องเปิดใช้งานIndexesตัวเลือกด้วยเช่นเปลี่ยน

    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>

ใน/etc/apache2/sites-enabled/000-defaultถึง:

    <Directory />
        Options FollowSymLinks Indexes
        AllowOverride None
    </Directory>

หรืออาจเป็นวิธีที่ปลอดภัยกว่าคือเปลี่ยนเป็น:

    <Directory />
        Options FollowSymLinks
        AllowOverride Indexes
    </Directory>

/home/user/mydir/.htaccessและใส่ใน

    Option Indexes

ทำไม. htaccess ไม่ทำงาน

โดยค่าเริ่มต้นวางOptions <something>ใน.htaccessไฟล์จะไม่ทำงานเพราะของรายการอื่น ๆ ในไฟล์ config AllowOverride Noneของคุณ:

นั่นเป็นเหตุผลที่เราต้องใส่ที่AllowOverride Indexesนั่น

( เอกสาร AllowOverride )


ดูไฟล์ปรับแต่งของฉันด้านบน ... มันยังใช้งานไม่ได้ ...
luca

มันเป็นปัญหาของการอนุญาตหรือไม่ ฉันเป็นผู้ใช้รูทฉันรู้ว่ามันไม่ดีที่จะใช้ระบบเป็นรูทอย่างไรก็ตามฉันรูทและไดเรกทอรีที่ฉันเชื่อมโยงอยู่ในรูทโฮม / รูท / mydir ..
ลูกา

1
ใช่. คุณเห็นข้อความแสดงข้อผิดพลาดอะไร คุณจะต้องทำsudo chmod ugo+x /root; sudo chmod ugo+rx /root/mydirเพื่อให้มันใช้งานได้และนั่นอาจไม่ใช่ความคิดที่ดี ดีกว่าที่จะย้ายไฟล์บางแห่งภายใต้/var/wwwถ้าคุณสามารถ
มิเคล

เมื่อใดก็ตามที่คุณได้รับข้อผิดพลาดและขอความช่วยเหลือคุณควรให้ข้อความแจ้งข้อผิดพลาดกับเรา /var/log/apache2/error.logและจะมีปมใน
มิเคล

7
ให้แน่ใจว่าคุณไม่ได้ชี้ไปไดเรกทอรีบ้านของคุณเมื่อคุณมีมันเข้ารหัสเช่นการเชื่อมโยงสัญลักษณ์ใน→/var/www /home/user/directoryมันจะทำให้ปวดหัวมาก

11

ต้องใช้ตัวเลือกดังนี้:

Options +FollowSymLinks

มักจะใส่ในการกำหนดค่า Apache ( httpd.confหรือconf.d/หรือsites-enabled/) <Directory>ภายใน

ดูOptions, AllowOverrideและ<Directory>ในเอกสาร Apache


1
ในกรณีของ FollowSymLinks โดยเฉพาะต้องอยู่ในโครงสร้าง Directory เมื่ออยู่ในไฟล์. conf จากคู่มือปัจจุบันของ Apache "ตัวเลือก FollowSymLinks และ SymLinksIfOwnerMatch ทำงานได้เฉพาะในส่วน <Directory> หรือไฟล์. htaccess"
ClearCrescendo

1
คำเตือน: การผสมตัวเลือกด้วย + หรือ - กับที่ไม่มีไวยากรณ์ที่ไม่ถูกต้องและมีแนวโน้มที่จะทำให้เกิดผลลัพธ์ที่ไม่คาดคิด
kurdtpage

10

ด้วยการกำหนดค่าดั้งเดิม (ใหม่) บน Ubuntu 14.04 ด้วย apache 2.4.7 ไม่จำเป็นต้องเปลี่ยนแปลงอะไรใน * .conf เพื่อติดตาม symlinks ที่สร้างขึ้นภายใต้ / var / www / html

แต่มันเป็นสิ่งจำเป็นที่ผู้ใช้ www ข้อมูลที่มีการเข้าถึงทุกเส้นทางของเป้าหมาย symlink (ที่แม้สำหรับ virtualhosts ไม่เพียง แต่สำหรับ simlinks) ตัวอย่างเช่น

cd /var/www/html
ln -s /path/to/mirror/cran-mirror cran

ในตัวอย่างนี้ผู้ใช้ www-data (หรือผู้ใช้ทั้งหมดหากคุณต้องการ แต่อาจเป็นอันตรายได้) จำเป็นต้องมีสิทธิ์ดำเนินการจนถึงไดเรกทอรี ต้องการสิทธิ์ x ในแต่ละ / path, / path / to, และ / path / to / mirror ต้องมีสิทธิ์การอ่านในไดเรกทอรีเป้าหมายและขึ้นอยู่กับเป้าหมายของไดเรกทอรีด้วยเช่นกันผู้ใช้ www-data ต้องการสิทธิ์ในการเขียนเช่นกัน

ได้รับเบาะแสจากhttps://stackoverflow.com/a/14623574


1

ฉันไม่สามารถทำงานได้จนกว่าจะติดตั้งโมดูล apache autoindex จากการโพสต์บล็อกจำนวนมากและโพสต์ฟอรั่มไม่มีใครพูดถึงความจำเป็น หวังว่านี่จะช่วยใครซักคน

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