Apache sẽ không tuân theo các liên kết tượng trưng (403 Forbidden)


90

Tôi đang gặp sự cố khi thiết lập Apache trên Ubuntu. Tôi đã làm theo hướng dẫn này .

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

Thư mục công cộng của tôi, / var / www, có thể phục vụ và thực thi thành công các trang PHP được đặt trong đó. Tuy nhiên, tôi muốn tạo một liên kết biểu tượng trong / var / www trỏ đến một thư mục trong thư mục chính của tôi và phục vụ các trang ở đó.

[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

Khi tôi cố gắng truy cập / about trên trình duyệt, tôi nhận được

Forbidden

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

Theo những gì tôi biết, tôi đã cấp đủ đặc quyền cho các tệp tôi muốn phân phát:

[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

Tôi biết tùy chọn FollowSymLinks và tôi tin rằng nó được đặt trong tệp / etc / apache2 / sites-enable / 000-default của tôi:

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>

Bất kỳ ý tưởng những gì tôi có thể bị thiếu?

Câu trả lời:


126

Kiểm tra xem Apache có quyền thực thi đối với /root, /root/site/root/site/about.

Chạy:

chmod o+x /root /root/site /root/site/about

8
Cảm ơn rất nhiều ... Tôi không nhận ra các thư mục mẹ cũng phải chạy được.
Tim

39
Vâng, tôi không nói nó sẽ không làm việc nhưng nói chung, cho o + x on / gốc không phải là một ý tưởng tốt;)
Michal Rzemieniecki

11
Michal nói đúng. Tôi thấy mình có thể sử dụng ACL (ít nhất là trong Mac ):, chmod -R +a "_www allow list,search,readattr" /root /root/site /root/site/aboutcấp các quyền đó chỉ cho ứng dụng apache (_www), an toàn hơn một chút so với "other".
James S

1
Trên Mac OS (10.9.4) ~ / Documents của tôi không có quyền thực thi và tôi có một kho git nơi nó sẽ lưu trữ các tệp trang web của tôi. Cấp chmod o + x trên ~ / Documents đã thành công! Cảm ơn!
Ernani Joppert

1
Cuối cùng cũng có câu trả lời! Cảm ơn.
whoan

21

Lỗi 403 cũng có thể do hệ thống tệp được mã hóa, ví dụ: liên kết biểu tượng đến thư mục chính được mã hóa .

Nếu liên kết biểu tượng của bạn trỏ vào thư mục được mã hóa, người dùng apache (ví dụ: www-data) không thể truy cập nội dung, ngay cả khi quyền của apache và tệp / thư mục được đặt chính xác. Quyền truy cập của người dùng www-data có thể được kiểm tra bằng lệnh gọi như vậy:

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

Có những cách giải quyết / giải pháp cho vấn đề này, ví dụ như thêm người dùng www-data vào nhóm riêng tư của bạn (hiển thị dữ liệu được mã hóa cho người dùng web) hoặc bằng cách thiết lập một thư mục rsynced không được mã hóa (có thể là khá an toàn). Bản thân tôi có thể sẽ tìm kiếm giải pháp rsync trong quá trình phát triển.

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

Một công cụ thuận tiện cho mục đích của tôi là lsyncd . Điều này cho phép tôi làm việc trực tiếp trong thư mục chính được mã hóa của mình và có thể xem các thay đổi gần như ngay lập tức trong trang web apache. Đồng bộ hóa được kích hoạt bởi những thay đổi trong hệ thống tệp, gọi một rsync. Vì tôi chỉ làm việc trên các trang web và tập lệnh khá nhỏ nên quá trình đồng bộ hóa diễn ra rất nhanh. Tôi quyết định sử dụng độ trễ ngắn 1 giây trước khi rsync được khởi động, mặc dù có thể đặt độ trễ là 0 giây .

Cài đặt lsyncd (trong Ubuntu):

sudo apt-get install lsyncd

Khởi động dịch vụ nền:

lsyncd -delay 1 -rsync /home/<me>/<work folder>/ /var/www/html/<web folder>/

3
Đây sudo -u www-data ...là một cách tuyệt vời để kiểm tra xem có vấn đề về quyền hay không! Lưu ý rằng người dùng có thể là www-data, apache hoặc thứ gì đó khác tùy thuộc vào bản phân phối của bạn.
mkasberg

Arghh, cuối cùng! Tôi đã nghi ngờ khả năng cơ bản nhất của mình!
kalabalik

Mất hàng giờ để làm điều này và cuối cùng nó đã được mã hóa!
myol

15

Tôi đang gặp sự cố tương tự mà tôi không thể giải quyết trong một thời gian dài trên máy chủ mới của mình. Ngoài câu trả lời của palacsint, một câu hỏi hay được đặt ra là: bạn có đang sử dụng Apache 2.4 không? Trong Apache 2.4 có một cơ chế khác để thiết lập các quyền không hoạt động khi được thực hiện bằng cách sử dụng cấu hình trên, vì vậy tôi đã sử dụng giải pháp được giải thích trong bài đăng trên blog này .

Về cơ bản, những gì tôi cần làm là chuyển đổi tệp cấu hình của mình từ:

Alias /demo /usr/demo/html

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

</Directory>

đến:

Alias /demo /usr/demo/html

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

Lưu ý cách các dòng Lệnhcho phép đã được thay thế bằng Yêu cầu tất cả được cấp


Lưu ý rằng các lệnh Order / Allow / Deny vẫn có sẵn trên hầu hết các máy tính. Trong các phiên bản mới hơn, nó được thực hiện trong access_compatmô-đun. Nếu mô-đun đó được kích hoạt, phần đầu tiên không có khả năng hoạt động như mong đợi. Nếu nó không có ở đó, thì việc cố gắng khởi động Apache2 sẽ không thành công với lỗi.
Alexis Wilke

Cấu hình nào? Các /etc/httpd/conf/httpd.confkhông tồn tại trên hệ thống của tôi, và cũng có thể, thư mục /etc/httpd/không tồn tại.
Aaron Franke,

@AaronFranke Bạn đã cài đặt apache chưa? Có thể ở đây: /etc/apache2/httpd.conf /etc/apache2/apache2.conf /etc/httpd/httpd.conf /etc/httpd/conf/httpd.conf
RightHandedMonkey

Có, tôi đã cài đặt Apache và tôi đang sử dụng Ubuntu. /etc/apache2/apache2.conftồn tại cho tôi.
Aaron Franke

7

Liên quan đến câu hỏi này, tôi vừa mới tìm ra lý do tại sao vhost của tôi lại cung cấp cho tôi 403 đó.

Tôi đã thử nghiệm TẤT CẢ các khả năng cho câu hỏi này và những câu hỏi khác mà không gặp may. Nó gần như khiến tôi phát điên.

Tôi đang thiết lập một máy chủ với việc triển khai các bản phát hành tương tự như Capistrano theo cách thông qua các liên kết tượng trưng và khi tôi cố gắng truy cập vào thư mục DocRoot (hiện là liên kết tượng trưng cho thư mục phát hành hiện tại), nó đã cho tôi 403.

Vhost của tôi là:

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

và tệp httpd.conf chính của tôi là (cài đặt Apache 2.4 mặc định):

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

Nó chỉ ra rằng định nghĩa Tùy chọn chính đã được ưu tiên hơn so với fiel vhosts của tôi (đối với tôi đó là phản trực quan). Vì vậy, tôi đã thay đổi nó thành:

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

và Eureka! (lưu ý dấu cộng trước FollowSymLinks trong tệp MAIN httpd.conf. Hy vọng điều này sẽ giúp được một số người mất hồn khác.


Trong Apache 2.4, giải pháp của bạn sẽ làm mất hiệu lực cấu hình và httpd sẽ không khởi động được, vì bạn không thể kết hợp '+' và '-' trong một dòng Tùy chọn.
deesto

Đúng vậy, mặc dù tôi đã khai báo DocumentRoot "trước đó" trong tệp, nó đã ghi đè phần Thư mục con (cái gì?)
rogerdpack

2

Có một cách khác mà các liên kết tượng trưng có thể khiến bạn thất bại, như tôi đã phát hiện ra trong tình huống của mình. Nếu bạn có hệ thống SELinux làm máy chủ và các liên kết tượng trưng trỏ đến một thư mục được gắn NFS (các hệ thống tệp khác có thể mang lại các triệu chứng tương tự), httpdcó thể thấy các ngữ cảnh sai và từ chối cung cấp nội dung của các thư mục đích.

Trong trường hợp của tôi, ngữ cảnh SELinux của /var/www/html(mà bạn có thể lấy ls -Z) là unconfined_u:object_r:httpd_sys_content_t:s0. Các liên kết tượng trưng trong /var/www/htmlsẽ có cùng ngữ cảnh, nhưng ngữ cảnh của mục tiêu của chúng, là một thư mục được gắn với NFS system_u:object_r:nfs_t:s0.

Giải pháp là thêm fscontext=unconfined_u:object_r:httpd_sys_content_t:s0vào các mounttùy chọn (ví dụ # mount -t nfs -o v3,fscontext=unconfined_u:object_r:httpd_sys_content_t:s0 <IP address>:/<server path> /<mount point>). rootcontextkhông liên quan và defcontextbị NFS từ chối. Tôi đã không cố gắng contextcủa chính nó.


2

Đầu tiên hãy tắt selinux (vim / etc / selinux / config)

vim /etc/httpd/conf/httpd.conf chỉnh sửa các dòng sau cho liên kết tượng trưng và lập chỉ mục thư mục:

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

Nếu tệp .htaccess thì AllowOverride tất cả


Điều gì sẽ xảy ra nếu tôi không có /etc/httpd/thư mục trên hệ thống của mình?
Aaron Franke

1

Đối với bất kỳ ai gặp sự cố sau khi nâng cấp lên 14.04 /ubuntu/452042/why-is-my-apache-not-working- after-upgrading-to-ubuntu-14-04 khi root được thay đổi trước khi nâng cấp = / var / www sau khi nâng cấp = / var / www / html


1

Ngoài việc thay đổi các quyền như các câu trả lời khác đã chỉ ra, tôi phải khởi động lại apache để nó có hiệu lực:

sudo service apache2 restart

0

Tuy nhiên, một cạm bẫy tinh vi khác, trong trường hợp bạn cần AllowOverride All :

Một nơi nào đó sâu trong cây fs, một tuổi .htaccess

    Options Indexes

thay vì

    Options +Indexes

là tất cả những gì cần thiết để vô hiệu hóa FollowSymLinkstập hợp trong cấu hình máy chủ và gây ra 403 bí ẩn ở đây.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.