6

Phần thích hợp của .htaccess của tôi trông như thế này:Vấn đề chuyển hướng 403 Forbidden đến 404 Not Found

Và nó tạo ra các phản ứng sau:

  • /bao gồm 403
  • /include/404
  • /include/config.inc 403

Tôi có thể nói bằng cách nhìn vào mẫu của tôi rằng vấn đề có thể nằm trong phần (/ .*) nhưng mọi thứ tôi đã thử đều cho tôi kết quả tương tự; thay vì liên tục nhận được 404 tôi nhận được 404 cho một trường hợp và 403 cho mọi thứ khác. Điều gì sai với biểu thức tôi đang sử dụng? Ngoài ra kể từ khi tôi phải làm điều này cho một vài thư mục là có một cách tiếp cận chăn mà sẽ cho phép tôi chuyển đổi tất cả 403 phản ứng 404?

UPDATE: tôi đã tìm thấy rằng bằng cách loại bỏ các FileMatch tôi nhận được kết quả tốt hơn, vì vậy .htaccess của tôi bây giờ trông như thế này:

Options -Indexes 
RedirectMatch 404 ^/include(/.*)?$ # Added dlamblin's first suggestion 

Và tạo ra các phản ứng sau:

  • /bao gồm 404
  • /include/404
  • /include/config.inc 403

UPDATE: Điều thú vị là đủ Tôi đã phát hiện ra rằng những điều sau đây tạo ra sản lượng khác nhau:

RedirectMatch 404 ^/include(/?|/.*)$ 
RedirectMatch 404 ^/template(/?|/.*)$ 

Các mô hình mẫu hoạt động trên tất cả các trường hợp tuy nhiên bao gồm vẫn tạo ra 403 cho tất cả các file trong bao gồm (ví dụ /include/config.inc) Đây có phải là vấn đề với tên thư mục và không phải là vấn đề với tệp .htaccess không?

CẬP NHẬT: Thông tin sau trong .htaccess của tôi xung đột với chuyển hướng khi truy cập /include/config.inc.

<FilesMatch config> 
    Order allow,deny 
    Deny from all 
</FilesMatch> 
+2

Đã lâu rồi, nhưng tôi muốn đề nghị bạn có thể giải quyết tất cả những vấn đề này bằng cách chỉ đưa các mẫu và mẫu của bạn vào đâu đó bên ngoài gốc tài liệu của bạn; đó là cách khó khăn nhất để tăng tốc và nó có tải ít hơn trên Apache để khởi động! –

+0

Giải pháp nhanh nhất và đơn giản nhất chỉ cần chỉ thị 'ErrorDocument' và trang PHP cho lỗi 404: [Chỉ cần sử dụng' http_response_code'.] (Http://stackoverflow.com/a/18109452/1134080) Không cần phải gây rối với ' RedirectMatch', 'RewriteEngine', v.v. – ADTC

Trả lời

5

Tôi có thể hiểu tại sao/bao gồm không bị RedirectMatch thu thập, bạn không kết thúc '/'tùy chọn, tuy nhiên phần /include/config.inc là một chút ở phía khó hiểu.

Đây là những gì tôi đã làm việc trên Apache 2.2:

<FilesMatch /include(/?|/.*)> 
    Order allow,deny 
    Deny from all 
</FilesMatch> 

RedirectMatch 404 ^/include(/?|/.*)$ 

này xử lý những trường hợp này:

/include 404 
/include/ 404 
/include/config.inc 404 

tôi đã phải thay đổi phần FilesMatch để cho/bao gồm một phần hoạt động tốt.

EDIT:

Dòng trận đấu cũng làm việc mà không có sự > phần < FilesMatch trong .htaccess và đưa ra các kết quả dự kiến.

+0

Phải có một cái gì đó khác gây ra vấn đề bởi vì sử dụng /include/config.inc này vẫn tạo ra một 403. Tôi sẽ làm một số đào trong httpd.conf của tôi và xem nếu một cái gì đó có can thiệp. –

+0

Điều gì sẽ sai về 'RewriteRule ^/include (/? | /.*)$ - [R = 404, NC, L]'? –

1

Em không muốn '^/include (/.*)?$'

Phần này là một phỏng đoán, nhưng những gì sẽ xảy ra nếu bạn đặt RedirectMatch trên khối. Bằng cách đó bạn sẽ không thể từ chối (cấm) truy cập vào yêu cầu trước khi bạn chuyển hướng yêu cầu đó đến 404.

+0

Điểm tốt, không may tôi nhận được kết quả tương tự. –

4

Một khả năng khác không phải là bận tâm phù hợp với toàn bộ đường dẫn:

RedirectMatch 404 ^/include 

Nếu có đường dẫn URL hiển thị công khai có thể bắt đầu với "/ include" (nói, "/ includeMe"), một bổ sung nhỏ sẽ tách riêng từ các URL công cộng:

RedirectMatch 404 ^/include(/|$) 
0

một này hoạt động như mong đợi cho tất cả các file/dirs với tên bắt đầu bằng dấu chấm ngay cả trong thư mục con:

<FilesMatch "^\..+"> 
    Order allow,deny 
    Deny from all 
    Satisfy All 
</FilesMatch> 
RedirectMatch 404 \/\..+$ 
1

Một cách tốt hơn và đơn giản là như sau:

1 - Insert trong conf chính của bạn (ví dụ: Bên ngoài vhost thế giới):

<IfModule mod_alias.c> 
RedirectMatch 404 ^/myDirectory(?|\/)$ 
</IfModule> 

với myDirectory = css, js, hình ảnh ...

2 - bạn có thể đặt cho mỗi thư mục -Indexes như sau:

cho phép nội dung chỉ thị "DirectoryIndex" Apache của bạn để được phục vụ:

<Directory "/myPathtoMyWebDocRoot/"> 
    Options Indexes 
    AllowOverride None 
    Order Allow, Deny 
    Allow from all 
</Directory> 

và Deny index thư mục cho người khác:

<Directory "/myPathtoMyWebDocRoot/myDirectory/"> 
    Options -Indexes 
    AllowOverride None 
    Order Allow, Deny 
    Allow from all 
</Directory> 

với myDirectory = *, css, images, js, bí mật, ... theo nhu cầu của bạn.

2

Với viết lại mod:

RewriteEngine on 

RewriteCond %{THE_REQUEST} ^.*/\. 
RewriteRule ^(.*)$ - [R=404] 

Mỗi tập tin hoặc thư mục người bắt đầu với một dấu chấm sẽ được chuyển đến 404.

/myDir/.svn => 404 
/.gitignore => 404 
/dir1/dir2_dir3/ 

Hoặc để thay đổi tất cả 403.400 lỗi vào 404 lỗi, đặt này tại cuối /etc/apache2/conf.d/localized-error-pages HOẶC thành .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

Trong trường hợp đó bạn không cần sử dụng Options -Indexes Giải pháp của tôi để ngừng hiển thị nội dung của thư mục dưới dạng danh sách và hiển thị lỗi 404 rất đơn giản. Tạo tệp .htaccess trong thư mục gốc của dự án của bạn và viết thư mục nào cần được bảo vệ.

Thư mục cấu trúc

- your_root_directory 
    - .htaccess 
    - 404.html 
    - index.html 
    - app 
    - other files I do not want to show 
    - models 
    - other files I do not want to show 

.htaccess

RewriteEngine On 
RewriteRule ^app/ - [R=404,L] 
RewriteRule ^models/ - [R=404,L] 

ErrorDocument 404 /your_root_directory/404.html Dòng thứ hai của .htaccess không cho phép truy cập vào danh sách các mục trong thư mục ứng dụng và tất cả subridectories của nó.

Dòng thứ ba của .htaccess không cho phép truy cập vào các mục danh sách trong thư mục mô hình và tất cả các thư mục con của nó.

Dòng thứ tư của dòng .htaccess đặt lỗi 404 riêng của chúng tôi (nếu bạn không muốn hiển thị lỗi mặc định apache).

Nhớ xóa bộ nhớ cache trên trình duyệt của bạn khi bạn làm việc với htaccess.