Bagaimana cara memperbaiki 403 di Mac OS X built-in Apache?

25

Saya mencoba mengatur lingkungan lokal di MacBook Air 13 "saya yang baru: built-in Apache dengan saya sendiri DocumentRoot, PHP, dan MySQL. Saya biasanya memperbarui /etc/hostshanya untuk menjalankan situs web lokal saya dengan permalink yang cantik:. local/exampleUntuk referensi, saya biasanya memeriksa:

Kali ini aku hanya mendapatkan 403 Forbidden error setiap kali aku memukul 127.0.0.1, localhostatau local. Pertama saya melihat melalui terminal bahwa baik Apache dan PHP berjalan (walaupun saya tidak dapat melihat halaman PHP); kemudian saya memperbarui semua izin sesuai dengan izin Apache ; sekarang aku hanya putus asa. Berikut adalah konfigurasi Apache yang relevan:

  • /etc/hosts( lihat file - menambahkan satu baris)
  • /etc/apache2/httpd.conf( lihat file - memperbarui DocumentRoot)
  • /etc/apache2/users/joao.conf( lihat file - buat file ini)
  • /etc/apache2/extra/httpd-vhosts.conf( lihat file - diperbarui VirtualHost)

Sepertinya Apache entah bagaimana menolak saya akses ke saya DocumentRoot(yang omong-omong ~/Sites). Karena ~/Sitessebenarnya adalah symlink, saya kemudian mencoba memperbarui DocumentRootdengan jalur berikut (semua menunjuk ke direktori yang sama):

  • ~/Sites
  • /Users/joao/Sites
  • /Users/joao/Dropbox/Workflow/Sites( direktori asli )

Masih melempar 403 . Ada ide bagaimana cara memperbaikinya?

Pembaruan cepat - inilah /var/log/apache2/joao.pt-error_logtampilan saya :

[Sun Jul 07 12:50:45 2013] [error] [client 127.0.0.1] (13)Permission denied: access to / denied
[Sun Jul 07 12:50:45 2013] [error] [client 127.0.0.1] (13)Permission denied: access to /favicon.ico denied
[Sun Jul 07 12:50:45 2013] [error] [client 127.0.0.1] (13)Permission denied: access to /favicon.ico denied
[Sun Jul 07 12:50:45 2013] [error] [client 127.0.0.1] (13)Permission denied: access to /favicon.ico denied
[Sun Jul 07 12:50:47 2013] [error] [client ::1] (13)Permission denied: access to / denied
[Sun Jul 07 12:50:47 2013] [error] [client ::1] (13)Permission denied: access to / denied
[Sun Jul 07 12:50:48 2013] [error] [client ::1] (13)Permission denied: access to /favicon.ico denied
[Sun Jul 07 12:50:48 2013] [error] [client ::1] (13)Permission denied: access to /favicon.ico denied
João
sumber

Jawaban:

19

Saya memiliki alias yang ditentukan di server OSX yang menunjuk ke direktori pengguna. Saya menghabiskan waktu lama untuk bercanda dan bermain-main dengan pengguna _www, menambahkan izin yang dapat dieksekusi secara rekursif, mencopot macport dan segala macam hal yang mencoba agar ini berfungsi. Tidak tahu mengapa itu tidak berhasil.

Akhirnya, saya baru saja mencentang kotak "shared folder" di Finder untuk folder itu, dan itu berhasil , pada domain yang ditentukan, dengan php aktif, seperti yang saya inginkan. : / ... jadi itu mudah.

pengguna3481991
sumber
Itu tidak berhasil untuk saya. Saya membuat folder /Sites(di /folder root saya ) dan menaruh file-file saya di sana, mengkonfigurasi opsi Alias ​​dan Direktori yang sesuai. Bekerja dengan baik.
jpenna
11

Saya memperbarui ke macOSS Sierra , Versi 10.12

Saya menghadapi masalah yang sama, saya melakukan dua hal untuk memperbaikinya dengan benar. Berikut ini adalah pendekatan saya.

1) Silakan periksa file " /private/etc/apache2/extra/httpd-userdir.conf ". Perubahan

#Include /private/etc/apache2/users/*.conf

untuk

Include /private/etc/apache2/users/*.conf

2) ** Dan edit " /etc/apache2/httpd.conf" Anda

perubahan

Options FollowSymLinks Multiviews

untuk

Options FollowSymLinks Multiviews Indexes

akhirnya root doc Anda akan terlihat seperti berikut,

DocumentRoot "/Library/WebServer/Documents"
<Directory "/Library/WebServer/Documents">
Options FollowSymLinks Multiviews Indexes
MultiviewsMatch Any
AllowOverride All
Require all granted

3) Mulai ulang apache

sudo apachectl restart

Masih Anda menghadapi masalah, Silakan periksa Cara Mengatur Apache di macOS Sierra 10.12

Rakesh James
sumber
9

Saya biasanya memperbaiki ini dengan mengatur pengguna Apache untuk saya sendiri di lingkungan lokal dan di mesin di mana satu-satunya pengguna yang menggunakan Apache adalah saya. Di /private/etc/apache2/httpd.conf, setel Userke nama pengguna Anda _www, misalnya:

User _www

->

User joao

Dan kemudian restart Apache:

$ sudo apachectl restart

Langkah tambahan:

  1. Jika Anda memiliki sesi aktif, mereka akan memberikan kesalahan izin karena masih dimiliki oleh _www. Miliki mereka:

    $ sudo chown joao: /var/tmp/sess_*
    

Implikasi:

Setelah ini, Apache (dan PHP et al.) Akan berjalan seperti Anda dan akan mendapatkan izin baca / tulis untuk semua file yang telah Anda baca / tulis izin. Tetapi karena ini hanya lingkungan pengembangan lokal, yang seharusnya tidak menjadi masalah kecuali Anda tidak memiliki aturan untuk memblokir Apache di firewall Anda dan membiarkan file yang dipertanyakan seperti penjelajah file, kerang, skrip yang mungkin mengandung kerentanan berjalan di bawah Apache; dalam hal ini siapa pun termasuk tetangga wifi publik Anda di kafe dapat masuk http://<your IP>dan melakukan apa pun yang diizinkan oleh skrip tersebut.

Bahkan, Anda harus mencegah hal ini terlepas dari skrip yang Anda jalankan atau bahkan jika Anda tidak mengatur pengguna Apache untuk diri sendiri karena Anda mungkin tidak ingin orang luar acak dapat melihat konten Anda localhost.

Pencegahan:

  1. Buat Apache hanya mendengarkan localhost. Sekali lagi, di httpd.conf:

    Listen 80
    

    ->

    Listen 127.0.0.1:80
    

    Dan restart Apache lagi:

    $ sudo apachectl restart
    
  2. Nonaktifkan Apache di firewall aplikasi (perhatikan bahwa Anda mungkin telah menonaktifkannya jika Anda mengklik Denyjika / ketika ditanya saat pertama kali Anda menjalankan Apache):

    1. Buka System Preferences» Security & Privacy» Firewall.
    2. Klik ikon kunci di kiri bawah dan masukkan kata sandi Anda jika perlu.
    3. Nyalakan firewall jika dinonaktifkan.
    4. Klik Firewall Options.
    5. Klik +tombolnya.
    6. Tekan cmd ⌘+ ⇧ shift+ Gdan masukkan /usr/sbin/httpddan klik Add(Jika httpdtidak muncul di sana, Anda dapat mencarinya di terminal dengan which httpd)
    7. Dalam daftar klik httpddan pilih Block incoming connections.
    8. Hit OK.
    9. Muat ulang firewall:

      $ launchctl unload /System/Library/LaunchAgents/com.apple.alf.useragent.plist
      $ sudo launchctl unload /System/Library/LaunchDaemons/com.apple.alf.agent.plist
      $ launchctl load /System/Library/LaunchAgents/com.apple.alf.useragent.plist
      $ sudo launchctl load /System/Library/LaunchDaemons/com.apple.alf.agent.plist
      
  3. Batasi PHP ke root dokumen. Dalam php.ini:

    open_basedir = /Users/joao/Sites/:/var/tmp/
    

    ( /var/tmp/untuk sesi)

Gunakan ketiga solusi untuk mengamankan diri Anda jika salah satu dari mereka dinonaktifkan karena suatu alasan.

- Perhatikan bahwa karena bahasa aktif saya di mesin saya bukan bahasa Inggris yang benar, kata-kata mungkin sedikit berbeda (Pilihan menu dan kata-kata dapat berbeda terlepas dari bahasa dalam berbagai versi OS X).

- Baris yang dimulai dengan $harus dimasukkan dalam baris perintah (Terminal atau iTerm dll), dengan $dihapus.

Halil Özgür
sumber
5

Saya baru saja menyelesaikan masalah saya dengan menetapkan izin tidak hanya ke DocumentRootdirektori, tetapi juga untuk semua direktori induknya. Beginilah cara saya melakukannya .

(13) Izin Ditolak

Kesalahan 13 menunjukkan masalah izin sistem file. Artinya, Apache ditolak akses ke file atau direktori karena izin yang salah. Secara umum, ini tidak menyiratkan masalah dalam file konfigurasi Apache.

Untuk melayani file, Apache harus memiliki izin yang semestinya diberikan oleh sistem operasi untuk mengakses file-file itu. Secara khusus, Pengguna atau Grup yang ditentukan dalam httpd.conf harus dapat membaca semua file yang akan disajikan dan mencari direktori yang berisi file-file itu, bersama dengan semua direktori induk hingga ke root dari sistem file.

Izin khas pada sistem unix-like untuk sumber daya yang tidak dimiliki oleh Pengguna atau Grup yang ditentukan dalam httpd.conf adalah 644 -rw-r - r-- untuk file biasa dan 755 drwxr-xrx untuk direktori atau skrip CGI. Anda mungkin juga perlu memeriksa izin yang diperluas (seperti izin SELinux) pada sistem operasi yang mendukungnya.

Jika Anda menjalankan 2.4, kode kesalahan AH dapat memberi Anda informasi lebih lanjut di sini.

  • AH00132: izin file menolak akses server
  • AH00035: akses ditolak karena izin pencarian tidak ada pada komponen jalur Contoh

Katakanlah Anda menerima kesalahan Izin Ditolak saat mengakses file /usr/local/apache2/htdocs/foo/bar.html pada sistem mirip-unix.

Pertama periksa izin yang ada pada file:

cd /usr/local/apache2/htdocs/foo
ls -l bar.htm

Perbaiki jika perlu:

chmod 644 bar.html

Kemudian lakukan hal yang sama untuk direktori dan setiap direktori induk (/ usr / local / apache2 / htdocs / foo, / usr / local / apache2 / htdocs, / usr / local / apache2, / usr / local, / usr):

ls -la
chmod +x .
cd ..
# repeat up to the root

Pada beberapa sistem, nama utilitas dapat digunakan untuk membantu menemukan masalah izin dengan mendaftarkan izin di sepanjang setiap komponen jalan:

namei -m /usr/local/apache2/htdocs/foo/bar.html Jika sistem Anda tidak memiliki namei, Anda dapat menggunakan parsepath. Itu bisa didapat dari sini.

Jika semua izin standar sudah benar dan Anda masih mendapatkan kesalahan Izin yang Ditolak, Anda harus memeriksa izin yang diperluas. Misalnya Anda dapat menggunakan perintah setenforce 0 untuk mematikan SELinux dan memeriksa untuk melihat apakah masalah hilang. Jika demikian, ls -alZ dapat digunakan untuk melihat izin SELinux dan chcon untuk memperbaikinya.

Dalam kasus yang jarang terjadi, ini bisa disebabkan oleh masalah lain, seperti masalah izin file di tempat lain di file apache2.conf Anda. Misalnya, arahan WSGIScriptAlias ​​tidak memetakan ke file yang sebenarnya. Pesan kesalahan mungkin tidak akurat tentang file mana yang tidak dapat dibaca.

JANGAN mengatur file atau direktori ke mode 777, bahkan "hanya untuk menguji", bahkan jika "itu hanya server uji". Tujuan dari server uji adalah untuk memperbaiki keadaan di lingkungan yang aman, bukan untuk melakukan kesalahan. Semua itu akan memberi tahu Anda jika masalahnya ada pada file yang benar-benar ada.

Skrip CGI

Meskipun izin skrip CGI mungkin terlihat benar, biner aktual yang ditentukan dalam shebang mungkin tidak memiliki izin yang tepat untuk dijalankan. (Atau beberapa direktori di jalurnya, periksa dengan namei seperti yang dijelaskan di atas.)

(13) Izin ditolak: proxy: HTTP: upaya menyambung ke 127.0.0.1:8080 (localhost) gagal

Kesalahan ini sebenarnya bukan tentang izin file atau semacamnya. Apa artinya sebenarnya adalah bahwa httpd telah ditolak izin untuk terhubung ke alamat dan port IP tersebut.

Penyebab paling umum dari ini adalah SELinux tidak mengizinkan httpd untuk membuat koneksi jaringan.

Untuk mengatasinya, Anda perlu mengubah nilai boolean SELinux (yang secara otomatis akan bertahan di seluruh reboot). Anda mungkin juga ingin me-restart httpd untuk mengatur ulang pekerja proxy, meskipun ini tidak sepenuhnya diperlukan.

# setsebool -P httpd_can_network_connect 1

João
sumber
1
Bisakah Anda merangkum poin-poin dasar dalam jawaban Anda? Terima kasih!
Matt
2
Memberikan akses ke semua direktori induknya akan menjadi pelanggaran keamanan besar !
Julian F. Weinert
1
Jawaban ini tidak berguna. Solusinya bekerja untuk mesin / konfigurasi linux. OSX memiliki struktur direktori yang berbeda, khususnya untuk apache (terletak di / Library / WebServer) solusi yang diberikan bukan untuk OSx, seperti yang dilakukan apple.stackexchange.
Juan
3

Langkah-langkah berikut bekerja untuk saya di High Sierra menjalankan Apache 2.4

(Berdasarkan tutorial luar biasa berikut ini: http://www.cgi101.com/book/connect/mac.html , diperbarui dengan langkah-langkah tambahan untuk perbedaan versi)

  1. Pindahkan file ke:

    /Library/WebServer/CGI-Executables
    
  2. Pastikan file tersebut memiliki izin eksekusi:

    ls -l  /Library/WebServer/CGI-Executables
    

    Jika tidak digunakan:

    chmod -x  /Library/WebServer/CGI-Executables/myfile.cgi
    
  3. Batalkan komentar pada baris berikut di /etc/apache2/httpd.conf

    AddHandler cgi-script .cgi .pl
    
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
    
    LoadModule cgi_module libexec/apache2/mod_cgi.so
    
  4. Juga mengubah bait Direktori "/ Library / WebServer / CGI-Executables" menjadi:

    <Directory "/Library/WebServer/CGI-Executables">
     AllowOverride None
     Options ExecCGI
     Require all granted
    </Directory>
    
  5. Kemudian restart Apache:

    sudo apachectl -k restart
    

Hampir dengan setiap versi macOS baru, perubahannya akan hilang dan Anda harus mengulang pekerjaan, dan bahkan melakukan langkah-langkah berbeda untuk memperbaikinya. Teman baik Anda adalah log Apache yang terletak di / var / log / apache2 / (/ var / log / apache2 / error_log)

Rouke
sumber
1
Bukan jawaban melainkan observasi. Instruksi # 1 di atas: Pindahkan file ke: File apa?
Pam
0

Saya menggunakan ACL untuk mengatur izin, mengikuti instruksi di " Cara Mengatur Izin File dan Direktori untuk Apache di Mac OS X ", tetapi masih mendapatkan:

[Wed Feb 12 15:43:51 2014] [error] [client ::1] (13)Permission denied: access to /trace/trace.php denied (filesystem path '/Library/WebServer/Documents/trace/trace.php') because search permissions are missing on a component of the path

Kemudian saya membaca " (13) Izin Ditolak " (ditautkan dalam jawaban João Ramos ) dan mencoba menambahkan "eksekusi" ke ACL. Itu berhasil.

Daryl Spitzer
sumber
0

Hidupkan Kembali komputer Anda! Ini berhasil untuk saya.

Tapi pertama -tama saya telah mengubah pengguna di bawah apache ke saya sendiri (dari _www), karena ini adalah lingkungan lokal / uji. Jadi pada akhirnya itu ada hubungannya dengan izin.

Kemudian hidupkan ulang mesin, sama seperti Windows;).

Stefan Pintilie
sumber
0

OP menjelaskan masalah yang timbul saat mencoba mengatur lingkungan server web lokal pada Mac, menggunakan Apache, PHP, dan MySQL, dengan DocumentRoot kustom, dan termasuk penyebutan menggunakan VirtualHost (vhost). Laporan OP mendapatkan 403 Forbidden error saat mengakses localhost.

Sebuah artikel di coolestguidesontheplanet menjelaskan bagaimana pengaturan host virtual di Apache menyebabkan "Kehilangan Localhost". Dengan kata lain, akar penyebab masalah OP mungkin adalah ketidakmampuan mengaktifkan vhosts.

"Setelah [host virtual] diatur, Anda kehilangan root dokumen lama Anda sebelumnya di / Library / WebServer / Documents atau diakses di browser di http: // localhost - Anda mendapatkan 403 Forbidden Error."

Artikel selanjutnya menjelaskan cara memperbaiki localhost di lingkungan vhost.

Add these lines to file /etc/apache2/extra/httpd-vhosts.conf:

   <VirtualHost *:80> 
   ServerName localhost 
   DocumentRoot /Library/WebServer/Documents/ 
   </VirtualHost>

Ini juga menjelaskan cara memperbaiki "masalah izin dengan hal-hal seperti pembaruan dan otentikasi" yang terkait dengan "menggunakan folder Users / nama pengguna / Situs untuk vhosts".

Instead of using the default UID _www, use your own User and Group.

In the terminal, enter command 

    id

Find your UID and GID. 
Update file httpd.conf
In section <IfModule unixd_module>
Change User and Group to your local UID and GID.

https://coolestguidesontheplanet.com/set-virtual-hosts-apache-mac-osx-10-10-yosemite/

BobK77
sumber
Terima kasih atas jawaban Anda. :) Sayangnya, jawaban singkat seperti ini tidak benar-benar memberikan detail atau konteks yang cukup untuk membantu banyak pengguna. Sebaliknya, bisakah Anda mengedit jawaban Anda untuk menyertakan ringkasan konten yang Anda tautkan? Ini akan membuat jawaban Anda lebih mandiri dan membantu melestarikannya untuk pengguna lain di masa depan.
Monomeeth
Terima kasih, Monomeeth. Hargai umpan baliknya. Diperbarui jawabannya.
BobK77