25

Có cách nào tôi có thể cấu hình máy chủ web Apache để trả lại mã lỗi 404 (không tìm thấy) thay vì 403 (bị cấm) đối với một số thư mục cụ thể mà tôi muốn không cho phép truy cập không?Có cách nào để buộc apache trả lại 404 thay vì 403 không?

Tôi đã tìm thấy một số giải pháp đề xuất việc sử dụng mod_rewrite, như ví dụ:

RewriteEngine On 
RewriteRule ^.*$ /404 [L] 

Như mục đích gửi 404 thay vì 403 là xáo trộn cấu trúc thư mục, giải pháp này là quá hở hang, bởi vì nó chuyển hướng đến một số vị trí khác nhau mà làm cho nó rõ ràng rằng các thư mục ban đầu truy cập nào trong thực tế tồn tại.

+0

[câu hỏi này] (http://stackoverflow.com/questions/548156/problem-redirecting-403-forbidden-to-404-not-found) có giải quyết được sự cố của bạn không? –

+0

Tôi đã không xem xét câu hỏi này khi tôi lần đầu tiên nhìn thấy nó (quá khó hiểu), nhưng sau một nháy mắt thứ hai tôi tìm thấy dòng tôi đã tìm kiếm, cảm ơn. – fuenfundachtzig

Trả lời

25

RedirectMatch như trong ví dụ:

RedirectMatch 404 ".*\/\..*" 

thực hiện thủ thuật, nó cấm truy cập vào tất cả các tệp hoặc thư mục bắt đầu bằng dấu chấm, gây ra lỗi "404 không tìm thấy".

Từ hướng dẫn Apache: "Chỉ thị Chuyển hướng [Ánh xạ] ánh xạ URL cũ thành một URL mới bằng cách yêu cầu khách hàng tìm nạp lại tài nguyên tại vị trí mới". Theo mặc định, Redirect gửi mã trả lại 302, nhưng cũng có thể trả lại mã trạng thái khác như được hiển thị ở trên.

+3

+1, nhưng để khớp một dấu chấm ở bất kỳ đâu trong đường dẫn url, chúng ta có thực sự cần dấu ngoặc kép và dấu chấm sao không? Tức là, chúng ta không thể chỉ làm 'RedirectMatch 404/\.' Thay vì 'RedirectMatch 404". * \/\ .. * "'? – zx81

5

Bạn có thể làm một cái gì đó như thế này:

.htaccess

ErrorDocument 403 /error/404.php

404.php

<?php 
$status = $_SERVER['REDIRECT_STATUS'] = 404; 
header($_SERVER['SERVER_PROTOCOL'] . ' ' . $status); 
?> 

404 Error 
+2

* Tại sao điều này không được bình chọn đủ? * Tôi đã sử dụng giải pháp này. Nó rất đơn giản. Tuy nhiên, vì tôi có PHP> = 5.4.0, tôi đơn giản sử dụng ' 'ở đầu trang' 404.php'. Bằng cách này tôi có thể sử dụng 'ErrorDocument *** bất kỳ mã nào ***/lỗi/404.php' và tất cả chúng sẽ trở thành '404' trong tiêu đề HTTP. – ADTC

+0

Điều gì sẽ xảy ra nếu tôi muốn gửi tất cả các yêu cầu đến một kịch bản lệnh điều khiển phía trước index.php duy nhất và quyết định xem có nên thực thi 404.php không? – tonix

+1

@ADTC, nó không liên quan đến câu hỏi, đó là cách yêu cầu Apache làm điều này, không phải PHP. –

-2

Để thay đổi tất cả 403.400 lỗi vào 404 lỗi, đặt này vào cuối /etc/apache2/conf.d/localized-error-pages HOẶC thành một .htaccess

# Will raise a 404 error, because the file <fake_file_for_apache_404.php> doesn't exist. 
# We change 403 or 400 to 404 ! 
ErrorDocument 400 /fake_file_for_apache_404.php 
ErrorDocument 403 /fake_file_for_apache_404.php 
# We need to rewrite 404 error, else we will have "fake_file_for_apache_404.php not found" 
ErrorDocument 404 "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\"><html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL <script type=\"text/javascript\">document.write(document.location.pathname);</script> was not found on this server.</p></body></html>" 
ErrorDocument 500 "Server in update. Please comme back later." 
+0

Tôi đã đưa ra cách đây 30 phút và biết rằng tôi nhận ra: HTML trả về 404, nhưng mã trạng thái HTTP vẫn trả về "HTTP/1.1 403 Forbidden" (Nên thay vì -1)! –

+0

Nó hoạt động. Xem chỉnh sửa của tôi tại http://stackoverflow.com/questions/6479198/denying-via-404-instead-of-403/20642687#20642687 – ImmortalPC

6

Sau khi cùng vấn đề, tôi đã kết thúc với các tập tin sau đây .htaccess

Options -Indexes 
RewriteCond %{HTTP_HOST} ^(www\.)?mydomain.com [NC] 
RewriteRule ^(.*)/$ - [R=404,NC] 

The 1st và dòng thứ 3 đảm bảo rằng bạn không thể liệt kê nội dung thư mục, và nếu bạn làm điều đó bạn sẽ nhận được một lỗi 404. Chỉ thị RewriteCond đảm bảo rằng quy tắc ghi lại này chỉ áp dụng cho miền chính. Vì tôi có một số tên miền phụ, không có rewritecond, truy cập www.mydomain.com/subdomain cũng trả lại 404, không phải là những gì tôi dự định.

+0

Điều này phù hợp với tôi. Chỉ có một vấn đề là cách 'Options-Indexes' hoạt động:/img/(không tồn tại) trả lại đúng 404, nhưng/img/(mà không tồn tại và tôi muốn truy cập vào, nhưng không phải là danh sách thư mục) 403. Vì vậy, những gì tôi đã làm là xóa 'Options-Indexes' và chỉ cần chắc chắn rằng các regexes (chỉ định các tệp được cho phép) không bao giờ khớp với tên thư mục. –

+0

* Đó không phải là tên miền phụ, nhưng một trang con ..., có thể bị bỏ qua bởi RewriteCond để kiểm tra thư mục (... -d ...) ... –

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