2011-09-11 18 views
75

Tôi đang gặp sự cố khi thiết lập Apache trên Ubuntu. Tôi đã theo dõi this guide.Apache sẽ không theo các liên kết tượng trưng (403 Cấm)

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

Thư mục công khai của tôi,/var/www, có thể phục vụ thành công và thực thi các trang PHP được đặt trong đó. Tuy nhiên, tôi muốn tạo một liên kết tượng trư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/khoảng 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ư tôi biết, tôi đã đủ đặc quyền để các tập tin tôi muốn phục vụ:

[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-enabled/000-mặc định 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 nào tôi có thể bị thiếu?

Trả lời

112

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

Run:

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 được thực thi. – Tim

+31

Vâng, tôi không nói nó sẽ không hoạt động nhưng nói chung, cho o + x trên/root không phải là một ý tưởng tốt;) –

+10

Michal là đúng. Tôi thấy tôi có thể sử dụng ACL (trong Mac, ít nhất): 'chmod -R + a" _www cho phép danh sách, tìm kiếm, readattr "/ root/root/site/root/site/about', cấp các quyền đó cho * * ứng dụng apache (_www), an toàn hơn một chút so với "khác". –

7

Tôi đã có một vấn đề 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 tôi. Ngoài câu trả lời của palacsint, một câu hỏi hay đặ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 nhau để thiết lập các điều khoản không hoạt động khi 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 solution explained in this blog post.

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

Alias /demo /usr/demo/html 

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

</Directory> 

tới:

Alias /demo /usr/demo/html 

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

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

+0

Lưu ý rằng các lệnh Order/Allow/Deny vẫn khả dụng 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 mô-đun 'access_compat'. Nếu mô-đun đó được bật, phần đầu tiên sẽ không hoạt động như mong đợi. Nếu nó không có, sau đó cố gắng để bắt đầu Apache2 nên thất bại với lỗi. –

4

Liên quan đến câu hỏi này, tôi chỉ tìm ra lý do tại sao vhost của tôi cho tôi 403.

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

Tôi đang thiết lập máy chủ có triển khai bản phát hành tương tự cách Capistrano thông qua liên kết tượng trưng và khi tôi cố gắng truy cập 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).

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à file httpd.conf chính của tôi là (mặc định Apache 2.4 cài đặt):

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

Nó chỉ ra rằng Options chính định nghĩa được dùng ưu tiên hơn của tôi vhosts fiel (đối với tôi đó là truy cập 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 khi FollowSymLinks trong tệp httpd.conf CHÍNH. Hy vọng điều này sẽ giúp một số linh hồn bị mất khác.

+0

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

0

Có một cách khác mà các liên kết tượng trưng có thể thất bại cho bạn, như tôi đã phát hiện trong trường hợp của tôi. hệ thống như máy chủ và các liên kết tượng trưng trỏ đến 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ự), httpd có thể thấy ngữ cảnh sai và từ chối phục vụ nội dung của thư mục đích. SELinux bối cảnh /var/www/html (mà bạn có thể có được với 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/html sẽ có bối cảnh tương tự, nhưng bối cảnh mục tiêu của họ, là thư mục được gắn NFS, là system_u:object_r:nfs_t:s0.

Giải pháp là thêm fscontext=unconfined_u:object_r:httpd_sys_content_t:s0 vào các tùy chọn mount (ví dụ: # mount -t nfs -o v3,fscontext=unconfined_u:object_r:httpd_sys_content_t:s0 <IP address>:/<server path> /<mount point>). rootcontext là không thích hợp và defcontext bị từ chối bởi NFS. Tôi không tự mình thử số context.

0

Đầu tiên vô hiệu hóa SELinux (vim/etc/selinux/config)

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

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

Nếu .htaccess nộp sau đó AllowOverride tất cả

11

Các lỗi 403 cũng có thể được gây ra bởi một hệ thống tập tin được mã hóa, ví dụ như symlink đến một mã hóa thư mục nhà.

Nếu liên kết tượng trư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 apache và tệp/thư mục được đặt chính xác. Truy cập của www-data dùng có thể được thử nghiệm với một cuộc gọi như vậy:

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

Có cách giải quyết/giải pháp này, ví dụ thêm www-data người dùng vào nhóm riêng của bạn (cho thấy nhiều dữ liệu được mã hóa cho người sử 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). Tôi cho bản thân mình có lẽ sẽ đi cho một giải pháp rsync trong quá trình phát triển.

https://askubuntu.com/questions/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 nhà đã được mã hóa của tôi và có thể thấy 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 tin, 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 việc đồng bộ hóa rất nhanh. Tôi quyết định sử dụng độ trễ ngắn 1 giây trước khi bắt đầu rsync, mặc dù có thể đặt độ trễ 0 giây.

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

sudo apt-get install lsyncd 

Bắt đầu dịch vụ nền:

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

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

+0

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

+0

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