Liên kết tượng trưng không được phép hoặc không thể truy cập mục tiêu liên kết


30

Tôi đã có bản cài đặt CentOS 6 hoàn toàn mới, có liên kết tượng trưng trong thư mục gốc đến các tệp phát triển của tôi:

[root@localhost html]# ls -l
total 4
-rwxrwxrwx. 1 root root  0 Sep 18 20:16 index.html
-rwxrwxrwx. 1 root root 17 Sep 18 20:16 index.php
lrwxrwxrwx. 1 root root 24 Sep 18 20:19 refresh-app -> /home/billy/refresh-app/

Httpd.conf của tôi có cái này:

<Directory "/">
    Options All
    AllowOverride None
    Order allow,deny
    Allow from all
</directory>

Mục tiêu của liên kết tượng trưng có quyền cho phép apache đọc bất cứ thứ gì nó muốn:

 [root@localhost billy]# ls -l
total 40 (Some entries were omitted because the list was too long
drwxr-xr-x. 7 billy billy 4096 Sep 18 20:03 refresh-app

Tôi cũng đã thử vô hiệu hóa SELinux bằng cách thay đổi /etc/selinux/conf:

SELINUX=disabled

Tuy nhiên, bất kể tôi làm gì, khi ai đó cố gắng truy cập liên kết đó http://localhost/refresh-app/, tôi nhận được trang lỗi 403 FORBIDDEN và điều này được viết trong /var/log/httpd/error_log:

Symbolic link not allowed or link target not accessible

Tại sao Apache không thể truy cập vào mục tiêu của symlink?


Những gì người dùng là apache chạy như? Bạn thực sự có thể đọc tài nguyên đó như người dùng đó không?
thoát khỏi

Đồng thời, tốt hơn hết là bạn nên chạy selinux ở chế độ cho phép và sau đó sử dụng sealert để phân tích nhật ký kiểm toán - điều này cho phép bạn thấy tại sao / làm thế nào mà Selinux từ chối và thậm chí còn cung cấp cho bạn một giải pháp.
thoát khỏi

@draeath: Tôi không biết làm thế nào để kiểm tra điều đó.
Billy ONeal

@draeath: 1. Đây không phải là hộp sản xuất; Tôi không quan tâm nếu Selinux tắt. 2. Trong mọi trường hợp, tôi chỉ khắc phục sự cố tại thời điểm này - có thể tôi sẽ khôi phục nó sau khi tôi tìm ra nguyên nhân gốc.
Billy ONeal

Đừng lo lắng đây là một sự giám sát phổ biến, lần đầu tiên tôi làm điều đó tôi đã bị mắc kẹt trong nhiều ngày, serverfault.com/questions/313485/iêu :: Đó là một trong những lỗi đó. : D
whoami

Câu trả lời:


44

Tìm thấy vấn đề. Hóa ra, Apache muốn truy cập vào không chỉ các thư mục Tôi đang phục vụ, /home/billy/refresh-app/mà còn tất cả các thư mục trên đó, cụ thể là /home/billy/, /home, và /. (Tôi không biết tại sao ... cho ai đó quyền truy cập vào thư mục con không nên yêu cầu cấp quyền cho mọi thứ ở trên thư mục con đó ....)

Tôi đoán nó đang tìm kiếm .htaccesshoặc một cái gì đó, hoặc có lẽ * nix là lạ về cách nó xử lý các quyền cho chuyển đổi thư mục.


15
Nó không lạ. Đó là cách nó hoạt động. Bạn phải có + x cho toàn bộ đường dẫn bạn đang cố truy cập.
bahamat

4
@bahamat: Điều đó không có nghĩa gì cả. Tại sao mọi người cần thực thi đặc quyền cho các tệp không được thực thi? (Điều này hoàn toàn giảm giá mà người ta không cần phải trao quyền cho /... khá nhiều bao giờ) Các hệ thống có ACL thường có một tùy chọn ngang thư mục riêng. Bạn sẽ nghĩ sau 30 năm kể từ khi Unix được thiết kế và có sẵn nhiều hệ thống ACL, ACL sẽ là tiêu chuẩn. : thở dài:
Billy ONeal

11
Tôi tin rằng anh ấy có nghĩa là + x trên các thư mục. Hãy thử chuyển sang người dùng và cd-ing vào thư mục w / o + x. Từ bộ nhớ + x cho phép bạn truy cập nhưng không thấy thư mục trong khi + r cho phép bạn liệt kê các tệp và + w cho phép bạn thay đổi các tệp trong thư mục đã nói

1
@BillyONeal: cụm từ "toàn bộ đường dẫn" ngụ ý các thư mục.
bahamat

5
Đây là hành vi đúng trong unix. Bạn cần thực thi các đặc quyền (+ x cho g hoặc o) trên các thư mục mẹ mà bạn đang cố gắng thay đổi thành các thư mục con bên dưới chúng.
slm

11

Tôi gặp một vấn đề tương tự khi tôi có cấu hình sau đây từng hoạt động với Ubuntu 10, nhưng đã ngừng hoạt động với Ubuntu 14 (Apache 2.4):

<Directory /var/www/vhosts/example.com/httpdocs>
    Options +FollowSymLinks
</Directory>

Chuyển sang vấn đề này đã sắp xếp vấn đề (mặc dù người dùng máy chủ web không thể truy cập trực tiếp vào liên kết tượng trưng)

<Directory /var/www/vhosts/example.com/httpdocs>
    Options +ExecCGI +FollowSymlinks -SymLinksIfOwnerMatch
</Directory>

Từ những gì tôi có thể nói chỉ là -SymLinksIfOwnerMatchcài đặt và có liên quan đến các thay đổi trong Apache 2.4 nhưng tôi đã không thử nghiên cứu nguyên nhân chính xác.

Tôi cũng nghĩ rằng nó có thể bị openbase_dirhạn chế trong PHP nhưng không phải vậy.


6

Lỗi này cũng có thể được gây ra nếu bạn đang liên kết đến một thư mục được mã hóa.


4

Nó xuất hiện "FollowSymLinks" là tùy chọn bạn cần trong httpd.conf. Nó được chi tiết ở đây . Có vẻ như bạn cũng có thể cần một quy tắc trong htdocs ... nhưng đó là tùy chọn bạn cần.


3
Xem Options All- FollowSymLinksđã được chỉ định.
Billy ONeal

2

Bạn cũng có thể muốn kiểm tra xem selinux có được thi hành hay không. Trên RedHat / Fedora, thực hiện điều này:

getenforce

Nếu phản hồi là 'Thực thi', bạn có thể muốn thực thi

setenforce 0

và thử lại url trong trình duyệt của bạn.

Lưu ý rằng tôi không nói rằng vô hiệu hóa selinux là cách tốt nhất để giải quyết vấn đề này, nhưng nó có thể giúp xác định nguyên nhân.


Điều này đã khắc phục vấn đề liên kết sym nhưng có bất kỳ tác động tiêu cực nào không?
digz6666

2
Options +FollowSymLinks

Tạo một tệp .htaccess với điều này đã giúp tôi (đặt nó vào một thư mục trước khi liên kết tượng trưng).


Trong trường hợp của tôi, tôi đã tạo /var/wwwmột liên kết tượng trưng đến một liên kết tượng trưng trung gian khác. Nếu bạn phải sử dụng các liên kết tượng trưng, ​​hãy biến nó thành một liên kết tượng trưng TRỰC TIẾP đến đích của bạn.
Sridhar Sarnobat

0

rằng những gì giải quyết vấn đề của tôi sau khi cho phép tất cả sự cho phép và cho phép theo dõi liên kết "Trong trường hợp FollowSymLinks cụ thể, nó PHẢI nằm trong cấu trúc Thư mục khi nằm trong tệp .conf. Từ hướng dẫn hiện tại của Apache

Tùy chọn FollowSymLinks và SymLinks IfOwnerMatch chỉ hoạt động trong các phần hoặc tệp .htaccess.

trả lời từ đây


0

Giải pháp của tôi là tạo một thư mục dùng chung cho tất cả các kho lưu trữ có tên /home/repo.

Sau đó, liên kết mềm từ nhà riêng của tôi như: ln -s /home/repo ~/Code nên ~/Code/www.xxxx.com/public điểm đến /home/repo/www.xxxx.com/public

và cũng là một liên kết vào các /var/www/html điểm gốc web apache để /home/repo/www.xxxx.com/public

Tìm thấy nó ở đây: https://github.com/al Afghanistanmi / ubfox-desktop_setup/wiki/Git-Local-Repousing-setup-Guide

Với một số nhào lộn symlink + nhóm người dùng, bạn có thể triển khai nhiều người dùng / phiên bản.


0

@Billey ONeil @Flion Tôi không thể trả lời theo dòng (số lượng đại diện thấp)
Đây là việc tôi phải làm:
( lưu ý: bí danh ll = 'ls $ LS_OPTIONS -lh')

root@Bellach:/var/www/html# ll lego
lrwxrwxrwx 1 root root 43 Sep 10 21:21 lego -> /home/DATA/Documents/Chris/Synced/web/lego/

Bây giờ hãy nhìn vào mọi thư mục trong liên kết nguồn

root@Bellach:/var/www/html# ll -d /home/DATA/Documents/Chris/Synced/web/
drwxr-xr-x 9 chris chris 4.0K Sep 12  2017 /home/DATA/Documents/Chris/Synced/web/
root@Bellach:/var/www/html# ll -d /home/DATA/Documents/Chris/Synced/
drwxr-xr-x 20 chris chris 4.0K Mar 27 18:52 /home/DATA/Documents/Chris/Synced/
root@Bellach:/var/www/html# ll -d /home/DATA/Documents/Chris/
drwxr-xr-x 36 chris chris 4.0K Jun 17 23:31 /home/DATA/Documents/Chris/
root@Bellach:/var/www/html# ll -d /home/DATA/Documents/
drwxr-xr-x 21 chris chris 4.0K Aug  7 18:22 /home/DATA/Documents/
root@Bellach:/var/www/html# ll -d /home/DATA/
drwxrwxr-- 10 root users 4.0K Sep 10 11:17 /home/DATA/
root@Bellach:/var/www/html# ll -d /home/
drwxr-xr-x 5 root root 4.0K Sep 10 10:37 /home/

/ home / DATA thư mục là thủ phạm.
Sửa nó bằng cái này:

root@Bellach:/var/www/html# chmod +x /home/DATA/
root@Bellach:/var/www/html# ll -d /home/DATA/
drwxrwxr-x 10 root users 4.0K Sep 10 11:17 /home/DATA/

Việc khắc phục là ngay lập tức - không cần phải khởi động lại apache.


-1

Bạn cũng có thể điều chỉnh cài đặt SELinux của mình và setenforce có thể không nằm trên đường dẫn của bạn. Vì vậy, hãy thử điều này:

sudo /usr/sbin/setenforce 0

và để duy trì điều này giữa các lần khởi động lại

sudo vi /etc/sysconfig/selinux
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.