2016-11-16 22 views
5

Tôi đang cố gắng hiểu tại sao Apache vẫn có thể phục vụ tệp PHP sau khi tôi đặt quyền 000 và cấp quyền sở hữu tệp gốc.Apache vẫn đang phục vụ tệp PHP với quyền không chính xác

Nếu tôi tạo tệp PHP thuộc sở hữu của máy chủ web có quyền 644, thì tệp được phân phát chính xác. Nếu sau đó tôi thay đổi quyền cho 000 và thay đổi quyền sở hữu thành root, tệp vẫn được cung cấp, nhưng tôi không nghĩ rằng nó nên được!

Nếu sau đó tôi khởi động lại Apache, tệp sẽ không được cung cấp. Tôi nhận được một 500 và các bản ghi lỗi grumbles về việc không thể mở một tập tin, đó là chính xác hành vi tôi mong đợi.

Sau khi khởi động lại, khi tệp không được phân phối, nếu tôi thay đổi quyền sở hữu trở lại máy chủ web và quyền trở lại 644, tệp sẽ được phân phát lại mà không cần phải khởi động lại apache.

Hành vi này chỉ đúng đối với các tệp PHP. Các tệp HTML hoạt động như tôi mong đợi, ngay sau khi bạn xóa quyền, các tệp không được phân phối.

Tôi đã đề xuất rằng Apache có thể đang duy trì một tệp xử lý trên tệp PHP và không thấy các thay đổi quyền cho đến khi khởi động lại. Tôi đã thử sử dụng lsof trên tệp, nhưng không thấy bất kỳ phần mô tả tệp mở nào.

Tôi cũng đã thử và thử nghiệm nơi tôi bắt đầu với quyền sở hữu máy chủ web và 644 quyền và kiểm tra tệp có thể được phân phối. Sau đó, tôi đổi tên tệp, thay đổi quyền thành 000 và quyền sở hữu thành thư mục gốc và sau đó di chuyển tệp trở lại. Sau đó, tệp là vẫn còn được phục vụ bởi Apache.

Có ai có thể làm sáng tỏ những gì đang xảy ra ở đây không?

+0

Thử nghiệm với điều này: truy cập 'my.hostname/index.php' trước và sau khi thay đổi, sau đó truy cập' my.hostname/index.php? Itok = randomnumbers' nếu yêu cầu thứ hai không thành công thì nó sẽ lưu vào bộ nhớ đệm. – apokryfos

+0

Bạn có chắc chắn trang web không được phục vụ từ bộ nhớ cache không? – dev0

+0

@apokryfos Tôi đã kiểm tra và chắc chắn nó không phải là bộ nhớ đệm. Tôi đã thay đổi kịch bản để hiển thị thời gian tính bằng giây và hiển thị chuỗi truy vấn. Kết quả của các bài kiểm tra tôi đã mô tả trong bài đăng của tôi là giống nhau và thời gian đang được cập nhật và chuỗi truy vấn (mà tôi thay đổi mỗi lần) đang được hiển thị. – Dom

Trả lời

5

Rất có thể điều đang xảy ra là bạn có hoạt động opcache. PHP biên dịch chính nó khi chạy. Để tiết kiệm chi phí, PHP 5.5 hoặc mới hơn có Opcache, giúp tiết kiệm bước biên dịch đó. Vì vậy, Apache có lẽ là bộ nhớ đệm tập tin. Sau đó, Apache sẽ lưu trữ tệp bộ nhớ cache với các quyền riêng của nó. Apache cũng có thể lưu vào bộ nhớ đệm trong bộ nhớ. Khi bạn khởi động lại Apache, nó phải quay trở lại tệp PHP cơ sở mà nó không còn quyền truy cập nữa.

+0

Yup, chỉ cần kiểm tra và đang chạy. Tôi không nghĩ rằng nó đã được cài đặt. – Dom

+1

Đúp kiểm tra tất cả kết quả của tôi với opcache.enable = 0 và nó hoạt động như tôi mong đợi - từ chối truy cập vào các tệp có 000 quyền. Cảm ơn – Dom

Các vấn đề liên quan