.htaccess mod_rewrite - cách loại trừ thư mục khỏi quy tắc ghi lại


145

Tôi có 8 dòng quy tắc viết lại trong tệp .htaccess của mình. Tôi cần loại trừ hai thư mục vật lý trên máy chủ của mình khỏi các quy tắc này để chúng có thể truy cập được. Bây giờ tất cả các yêu cầu được gửi đến tập tin index.php.

Các thư mục để loại trừ: "quản trị viên" và "người dùng".

Vì vậy, các yêu cầu http: http://www.domain.com/admin/ không nên được chuyển đến tệp index.php.

ErrorDocument 404 /index.php?mod=error404

Options  FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]

Tôi nghĩ rằng bạn đã quên các bộ định lượng sau [^/]một không gian đơn giản nếu không được phép ở đó (nó phải được thoát với \<space>).
Gumbo

Đúng Gumbo, bắt tốt :). nó phải là ^ ([^ /] +).
Kelvin

Câu trả lời:


287

Hãy thử quy tắc này trước các quy tắc khác của bạn:

RewriteRule ^(admin|user)($|/) - [L]

Điều này sẽ kết thúc quá trình viết lại.


Xin chào Gumbo, mã của bạn đã hoạt động nếu người dùng nhập domain.com/admin/ (với dấu gạch chéo kết thúc) nhưng không phải không có nó. Bạn có những gì có thể được thay đổi cho cả hai trường hợp để làm việc? Cảm ơn
Kelvin

@Kelvin: Sự xen kẽ ($|/)nên xử lý cả hai trường hợp.
Gumbo

Có tốt hơn không khi sử dụng RewriteCond ở đây thay vì RewriteRule?
rineez

7
@rineez RewriteCondluôn luôn yêu cầu RewriteRulenó được đính kèm. Và việc thêm điều kiện này như là một phủ RewriteCondđịnh cho mọi thứ RewriteRulecó thể khá cồng kềnh, một điều duy nhất RewriteRulelà một lối thoát trên những điều nên được bỏ qua trong trường hợp như vậy là thanh lịch hơn.
Gumbo

3
@Ergec Có nghĩa là không nên thay đổi bất cứ điều gì.
Gumbo

112

Những gì bạn cũng có thể làm là đặt tệp .htaccess chứa

RewriteEngine Off

Trong các thư mục bạn muốn loại trừ khỏi việc viết lại (theo quy tắc trong tệp .htaccess cao hơn trong cây). Đơn giản mà hiệu quả.


18
+1 ~ .htaccess hoạt động theo cấp bậc, vì vậy các thư mục cục bộ ghi đè lên cha mẹ của chúng, giống như một tầng bình thường trong CSS hoặc MVC.
Atari

4
chỉ có một điều bạn nên có: kích hoạt các tệp .htaccess (cài đặt AllowOverridethành bất kỳ thứ gì khác ngoài Nonecấu hình apache) buộc apache tìm kiếm .htaccess theo mọi yêu cầu. vì vậy, nếu bạn có một trang web / máy chủ web thường xuyên truy cập mà truy cập hệ thống tập tin / ổ cứng có thể có tác động hiệu suất lớn ...
bohrsty

Lời khuyên hoàn hảo để xác nhận gia hạn chứng chỉ SSL thông qua phương pháp tệp. Không cần sửa đổi bất cứ điều gì bên ngoài các thư mục tạm thời, hoặc trong tệp vhost. Sau khi xác thực xong, bạn có thể xóa toàn bộ thư mục và bạn đã hoàn tất. Tuyệt vời
Countzero

25

thêm một điều kiện để kiểm tra thư mục quản trị, đại loại như:

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]

Xin chào Rob, tôi đã đặt dòng này ngay sau "RewriteBase /" và bây giờ tôi nhận được "500 Lỗi - Lỗi máy chủ nội bộ"
Kelvin

@Kelvin Tôi đã chỉnh sửa câu trả lời của mình, thêm điều kiện trước mỗi quy tắc bạn muốn áp dụng.
Cướp

Đây là người duy nhất thực sự giúp tôi. Các câu trả lời được chấp nhận đã không giúp tôi.
Uwe Keim

5

Nếu bạn muốn xóa một thư mục cụ thể khỏi quy tắc (có nghĩa là bạn muốn xóa thư mục foo ), bạn có thể sử dụng:

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/foo/$
RewriteRule !index\.php$ /index.php [L]

RewriteRule ở trên sẽ viết lại tất cả các yêu cầu thành /index.php không bao gồm các yêu cầu cho / foo / .

Để loại trừ tất cả các chỉ thị tồn tại, bạn sẽ cần sử dụng điều kiện sau trên quy tắc của mình:

RewriteCond %{REQUEST_FILENAME} !-d

quy tắc sau

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !index\.php$ /index.php [L]

viết lại mọi thứ (trừ directries) thành /index.php .


5

Chúng tôi đã sử dụng quy tắc mod_rewrite sau:

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/test/
RewriteCond %{REQUEST_URI} !^/my-folder/
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]

Chuyển hướng này (vĩnh viễn với chuyển hướng 301) tất cả lưu lượng truy cập đến trang web đến http://www.newdomain.com , ngoại trừ yêu cầu tài nguyên trong thư mục / test và / my-thư mục. Chúng tôi chuyển người dùng đến tài nguyên chính xác mà họ yêu cầu bằng cách sử dụng nhóm chụp (. *) Và sau đó bao gồm $ 1 trong URL mới. Tâm trí không gian.


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.