Apache tidak akan mengikuti symlink (403 Forbidden)

92

Saya mengalami masalah saat menyiapkan Apache di Ubuntu. Saya telah mengikuti panduan ini .

# /usr/sbin/apache2 -v
Server version: Apache/2.2.17 (Ubuntu)
Server built:   Feb 22 2011 18:33:02

Direktori publik saya, / var / www, berhasil menyajikan dan menjalankan halaman PHP yang ditempatkan di dalamnya. Namun, saya ingin membuat symlink di / var / www yang mengarah ke direktori di folder home saya dan melayani halaman di sana.

[root /var/www]# ll
total 36
drwxr-xr-x  3 root root 4096 2011-09-11 14:22 .
drwxr-xr-x 14 root root 4096 2011-06-04 22:49 ..
lrwxrwxrwx  1 root root   16 2011-09-11 13:21 about -> /root/site/about

Saat saya mencoba mengakses / tentang di browser, saya mengerti

Forbidden

You don't have permission to access /about on this server.

Sejauh yang saya tahu, saya memberikan hak istimewa yang cukup untuk file yang ingin saya layani:

[root ~/site/about]# ll
total 24
drwxr-xr-x 5 root root 4096 2011-09-11 13:20 .
drwxr--r-- 3 root root 4096 2011-09-11 13:19 ..
drwxr-xr-x 2 root root 4096 2011-09-11 13:21 contact
-rwxr-xr-x 1 root root 1090 2011-09-11 13:19 index.php
drwxr-xr-x 2 root root 4096 2011-09-11 13:20 me
drwxr-xr-x 2 root root 4096 2011-09-11 13:21 resume

Saya mengetahui opsi FollowSymLinks, dan saya yakin ini disetel di file / etc / apache2 / sites-enabled / 000-default saya:

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

Tahu apa yang bisa saya lewatkan?

Tim
sumber

Jawaban:

129

Check that Apache has execute rights for /root, /root/site and /root/site/about.

Run:

chmod o+x /root /root/site /root/site/about
palacsint
sumber
8
Thanks a lot... I didn't realize the parent directories also had to be executable.
Tim
39
Yah, saya tidak mengatakan itu tidak akan berhasil tetapi secara umum, memberikan o + x pada / root bukanlah ide yang baik;)
Michal Rzemieniecki
11
Michal benar. Saya merasa saya dapat menggunakan ACL (di Mac, setidaknya) :, chmod -R +a "_www allow list,search,readattr" /root /root/site /root/site/aboutyang memberikan izin tersebut hanya ke aplikasi apache (_www), yang sedikit lebih aman daripada "lainnya".
James S
1
Di Mac OS (10.9.4) my ~ / Documents tidak memiliki hak eksekusi dan saya memiliki git repo yang akan menampung file situs saya. Memberikan chmod o + x pada ~ / Documents berhasil! Terima kasih!
Ernani Joppert
1
Akhirnya mendapat jawabannya! Terima kasih.
whoan
22

Kesalahan 403 juga dapat disebabkan oleh sistem file terenkripsi, misalnya symlink ke folder rumah terenkripsi .

Jika symlink Anda mengarah ke folder terenkripsi, pengguna apache (mis. Www-data) tidak dapat mengakses konten, meskipun izin apache dan file / folder diatur dengan benar. Akses pengguna www-data dapat diuji dengan panggilan seperti ini:

sudo -u www-data ls -l /var/www/html/<your symlink>/

Ada solusi / solusi untuk ini, misalnya menambahkan data-www pengguna ke grup pribadi Anda (mengekspos data terenkripsi ke pengguna web) atau dengan membuat folder rsynced yang tidak terenkripsi (mungkin agak aman). Saya sendiri mungkin akan mencari solusi rsync selama pengembangan.

/ubuntu/633625/public-folder-in-an-encrypted-home-directory

Alat yang nyaman untuk tujuan saya adalah lsyncd . Ini memungkinkan saya untuk bekerja langsung di folder utama terenkripsi saya dan dapat melihat perubahan hampir secara instan di halaman web apache. Sinkronisasi dipicu oleh perubahan dalam sistem file, memanggil rsync. Karena saya hanya mengerjakan halaman web dan skrip yang agak kecil, sinkronisasi berjalan sangat cepat. Saya memutuskan untuk menggunakan jeda singkat 1 detik sebelum rsync dimulai, meskipun dimungkinkan untuk menyetel jeda 0 detik .

Menginstal lsyncd (di Ubuntu):

sudo apt-get install lsyncd

Memulai layanan latar belakang:

lsyncd -delay 1 -rsync /home/<me>/<work folder>/ /var/www/html/<web folder>/
pengguna3811904
sumber
3
Ini sudo -u www-data ...adalah cara terbaik untuk memeriksa apakah ada masalah perizinan! Perhatikan bahwa pengguna dapat berupa www-data, apache, atau yang lainnya tergantung pada distro Anda.
mkasberg
Arghh, akhirnya! Saya sudah meragukan kemampuan saya yang paling dasar!
kalabalik
Kehilangan jam untuk ini dan akhirnya enkripsi!
myol
15

Saya mengalami masalah serupa yang tidak dapat saya selesaikan untuk waktu yang lama di server baru saya. Selain jawaban palacsint, pertanyaan yang bagus untuk ditanyakan adalah: apakah Anda menggunakan Apache 2.4? Di Apache 2.4 ada mekanisme berbeda untuk pengaturan izin yang tidak berfungsi ketika dilakukan dengan menggunakan konfigurasi di atas, jadi saya menggunakan solusi yang dijelaskan dalam posting blog ini .

Pada dasarnya, yang perlu saya lakukan adalah mengonversi file konfigurasi saya dari:

Alias /demo /usr/demo/html

<Directory "/usr/demo/html">
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    allow from all

</Directory>

untuk:

Alias /demo /usr/demo/html

<Directory "/usr/demo/html">
    Options FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

Perhatikan bagaimana baris Urutan dan izinkan telah diganti dengan Memerlukan semua yang diberikan

RightHandedMonkey
sumber
Perhatikan bahwa perintah Order / Allow / Deny masih tersedia di sebagian besar komputer. Di versi yang lebih baru, ini diimplementasikan di access_compatmodul. Jika modul itu diaktifkan, bagian pertama kemungkinan tidak akan berfungsi seperti yang diharapkan. Jika tidak ada, mencoba menjalankan Apache2 akan gagal dengan kesalahan.
Alexis Wilke
Konfigurasi yang mana? Tidak /etc/httpd/conf/httpd.confada di sistem saya, dan juga, direktori /etc/httpd/tersebut tidak ada.
Aaron Franke
@AaronFranke Apakah apache sudah terpasang? Bisa di sini: /etc/apache2/httpd.conf /etc/apache2/apache2.conf
/etc/httpd/httpd.conf /etc/httpd/conf/httpd.conf
Ya, saya telah menginstal Apache, dan saya menggunakan Ubuntu. /etc/apache2/apache2.confada untuk saya.
Aaron Franke
7

Terkait dengan pertanyaan ini, saya baru tahu mengapa vhost saya memberi saya 403 itu.

Saya telah menguji SEMUA kemungkinan pada pertanyaan ini dan lainnya tanpa keberuntungan. Ini hampir membuatku gila.

Saya menyiapkan server dengan peluncuran rilis yang mirip dengan Capistrano melalui symlinks dan ketika saya mencoba mengakses folder DocRoot (yang sekarang menjadi symlink ke folder rilis saat ini) itu memberi saya 403.

Vhost saya adalah:

DocumentRoot /var/www/site.com/html
<Directory /var/www/site.com/html>
        AllowOverride All
        Options +FollowSymLinks
        Require all granted
</Directory>

dan file httpd.conf utama saya adalah (default Apache 2.4 install):

DocumentRoot "/var/www"
<Directory "/var/www">
    Options -Indexes -FollowSymLinks -Includes
(...)

Ternyata definisi Opsi utama lebih diutamakan daripada vhosts fiel saya (bagi saya itu kontra intuitif). Jadi saya telah mengubahnya menjadi:

DocumentRoot "/var/www"
<Directory "/var/www">
    Options -Indexes +FollowSymLinks -Includes
(...)

dan Eureka! (perhatikan tanda plus sebelum FollowSymLinks di file httpd.conf UTAMA. Semoga ini membantu beberapa jiwa yang hilang lainnya.

mustangp51d
sumber
Di Apache 2.4, solusi Anda akan membatalkan konfigurasi dan httpd akan gagal dimulai, karena Anda tidak dapat menggabungkan '+' dan '-' dalam satu baris Opsi.
deesto
Ya itu saja, meskipun saya telah mendeklarasikan DocumentRoot "sebelumnya" dalam file itu menimpa bagian Direktori anak (apa?)
rogerdpack
2

Ada cara lain yang membuat tautan simbolis gagal, seperti yang saya temukan dalam situasi saya. Jika Anda memiliki sistem SELinux sebagai server dan tautan simbolik mengarah ke folder yang dipasang di NFS (sistem file lain mungkin menghasilkan gejala yang sama),httpd mungkin melihat konteks yang salah dan menolak untuk menyajikan konten folder target.

Dalam kasus saya, konteks SELinux /var/www/html(yang dapat Anda peroleh ls -Z) adalah unconfined_u:object_r:httpd_sys_content_t:s0. Tautan simbolis di /var/www/htmlakan memiliki konteks yang sama, tetapi konteks target mereka, menjadi folder yang dipasang di NFS, adalah system_u:object_r:nfs_t:s0.

Solusinya adalah dengan menambahkan fscontext=unconfined_u:object_r:httpd_sys_content_t:s0ke mountpilihan (misalnya # mount -t nfs -o v3,fscontext=unconfined_u:object_r:httpd_sys_content_t:s0 <IP address>:/<server path> /<mount point>). rootcontexttidak relevan dan defcontextditolak oleh NFS. Saya tidak mencoba contextsendiri.

Urhixidur
sumber
2

Pertama nonaktifkan selinux (vim / etc / selinux / config)

vim /etc/httpd/conf/httpd.conf edit baris berikut untuk symlink dan pengindeksan direktori:

documentroot /var/www/html
<directory /var/www/html>
    Options Indexes FollowSymLinks
    AllowOverride None
</directory>

Jika file .htaccess maka AllowOverride all

nsn srinivas.dll
sumber
Bagaimana jika saya tidak memiliki /etc/httpd/folder di sistem saya?
Aaron Franke
1

Selain mengubah izin seperti yang ditunjukkan oleh jawaban lain, saya harus memulai ulang apache agar dapat diterapkan:

sudo service apache2 restart
tmath
sumber
0

Namun kesalahan kecil lainnya, jika Anda membutuhkan AllowOverride All:

Di suatu tempat jauh di dalam pohon fs, tua .htaccessmemiliki

    Options Indexes

dari pada

    Options +Indexes

hanya itu yang diperlukan untuk menonaktifkan FollowSymLinksset di konfigurasi server dengan santai, dan menyebabkan 403 misterius di sini.

Sz.
sumber
0

Dengan opsi FollowSymLinks diaktifkan:

$ rg "FollowSymLinks" /etc/httpd/
/etc/httpd/conf/httpd.conf
269:    Options Indexes FollowSymLinks

Anda membutuhkan semua direktori di symlink agar dapat dieksekusi oleh pengguna yang digunakan httpd.

jadi untuk kasus penggunaan umum ini:

cd /path/to/your/web
sudo ln -s $PWD /srv/http/

Anda dapat memeriksa izin pemilik dengan namei :

$ namei -m /srv/http/web
f: /srv/http/web
 drwxr-xr-x /
 drwxr-xr-x srv
 drwxr-xr-x http
 lrwxrwxrwx web -> /path/to/your/web
   drwxr-xr-x /
   drwxr-xr-x path
   drwx------ to
   drwxr-xr-x your
   drwxr-xr-x web

Dalam kasus saya, todirektori hanya dapat dieksekusi untuk pengguna saya:

Aktifkan eksekusi oleh orang lain, selesaikan:

chmod o+x /path/to

Lihat direktori yang tidak dapat dieksekusi mungkin berbeda, atau Anda perlu memengaruhi grup, bukan yang lain, yang bergantung pada kasus Anda.

albfan.dll
sumber