2009-02-27 36 views
14

Tôi hy vọng có một cách để làm điều này với mod_rewrite và Apache, nhưng có lẽ có một cách khác để xem xét quá.Chỉ yêu cầu chuyển hướng nếu không tìm thấy tệp?

Trên trang web của tôi, tôi có các thư mục được thiết lập cho các phiên bản lại của trang web cho khách hàng. Nếu gốc web là /home/blah/www, một thư mục khách hàng sẽ là /home/blah/www/clients/abc. Khi bạn truy cập thư mục máy khách thông qua trình duyệt web, tôi muốn nó sử dụng bất kỳ tệp được yêu cầu nào trong thư mục máy khách nếu chúng tồn tại. Nếu không, tôi muốn nó sử dụng tệp trong gốc web.

Ví dụ: giả sử khách hàng không cần index.html của riêng họ. Do đó, một số mã sẽ xác định rằng không có index.html trong /home/blah/www/clients/abc và thay vào đó sẽ sử dụng mã trong số /home/blah/www. Hãy nhớ rằng tôi không muốn chuyển hướng máy khách đến gốc web bất kỳ lúc nào, tôi chỉ muốn sử dụng tệp của web root với tên đó nếu thư mục máy khách chưa chỉ định bản sao của riêng nó. Trình duyệt web vẫn nên trỏ đến /clients/abc cho dù tệp tồn tại ở đó hay trong thư mục gốc. Tương tự như vậy, nếu có yêu cầu cho news.html trong thư mục ứng dụng khách và hiện có tồn tại ở đó, thì chỉ cần phân phát tệp đó thay vì số news.html của web root. Trải nghiệm của người dùng phải liền mạch.

Tôi cần điều này để làm việc cho các yêu cầu trên bất kỳ tên tệp nào. Ví dụ: nếu tôi cần, hãy thêm một dòng mới vào .htaccess cho mọi tệp tôi có thể muốn chuyển hướng, thay vì đánh bại mục đích là có quá nhiều bảo trì cần thiết và cơ hội tốt cho các lỗi được cung cấp cho số lượng tệp lớn.

Trong ví dụ của bạn, vui lòng cho biết liệu mã của bạn có nằm trong tệp .htaccess trong thư mục ứng dụng hoặc gốc web hay không. Web root được ưu tiên.

Trả lời

4

tôi dường như có ít nhất một vấn đề với mỗi ví dụ một bove. %{DOCUMENT_ROOT} dường như làm điều sai ở một số nơi nhất định và một số ký tự / dường như bị thiếu. Đây là giải pháp của tôi, trong đó có trong .htaccess trong gốc web.

Thay vì sử dụng hai quy tắc (một cho trường hợp tệp trong ứng dụng khách được tìm thấy và không tìm thấy), tất cả những gì tôi cần kiểm tra là tập tin được yêu cầu (hoặc thư mục) KHÔNG tồn tại. Bởi vì nếu nó tồn tại, không có thay đổi là cần thiết, nó chỉ có thể sử dụng các tập tin được cung cấp trong thư mục khách hàng. Đây là mã tôi đã giải quyết trên:

RewriteEngine on 
RewriteCond %{DOCUMENT_ROOT}/clients/$1/$2 !-f 
RewriteCond %{DOCUMENT_ROOT}/clients/$1/$2 !-d 
RewriteRule ^clients/([^/]+)/(.*)$ $2 [L] 

Cảm ơn sự giúp đỡ của bạn!

3
RewriteCond %{REQUEST_FILENAME} !-f 
+1

Có vẻ quá ngắn để làm những gì tôi muốn. Bạn có thể giải thích logic một chút được không? Cảm ơn! – DivideByHero

23
# If requested resource exists as a file or directory, skip next two rules 
RewriteCond %{DOCUMENT_ROOT}/$1 -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/$1 -d 
RewriteRule (.*) - [S=2] 
# 
# Requested resource does not exist, do rewrite if it exists in /archive 
RewriteCond %{DOCUMENT_ROOT}/archive/$1 -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/archive/$1 -d 
RewriteRule (.*) /archive/$1 [L] 
# 
# Else rewrite requests for non-existent resources to /index.php 
RewriteRule (.*) /index.php?q=$1 [L] 

Từ Rewrite if files do not exist

0

Hãy thử điều này:

RewriteEngine on 
RewriteRule ^clients/abc/ - [L] 
RewriteCond %{DOCUMENT_ROOT}clients/abc/$0 -f 
RewriteRule .* clients/abc/$0 [L] 
+0

Điều này có dành cho .htaccess trong thư mục gốc web không? – DivideByHero

+0

Có, nó dành cho tệp .htaccess trong thư mục gốc của tài liệu. – Gumbo

0

Tôi nghĩ rằng bạn muốn một cái gì đó dọc theo những dòng:

RewriteEngine on 
RewriteCond %{DOCUMENT_ROOT}clients/$1/$2 -f 
RewriteRule ^clients/([^/]+)/(.*)$ %{DOCUMENT_ROOT}clients/$1/$2 [L] 
RewriteRule ^clients/([^/]+)/(.*)$ %{DOCUMENT_ROOT}$2 [L] 
+0

Điểm tốt. Nhưng trong.Tệp htaccess mẫu không được bắt đầu bằng dấu gạch chéo. Và sẽ thuận tiện hơn nếu bạn sử dụng biến DOCUMENT_ROOT. – Gumbo

+0

Bạn có thể làm rõ cách cập nhật này với DOCUMENT_ROOT không? Nó không hoạt động như vậy. – DivideByHero

+0

Thay thế trong RewriteCond “/ home/blah/www /” bằng “% {DOCUMENT_ROOT}” và xóa nó trong phần thay thế. Ngoài ra, hãy xóa "/" hàng đầu trong các mẫu biểu thức chính quy. Sau đó, nó sẽ làm việc. – Gumbo

9

Làm thế nào về điều này?

# If requested resource exists as a file or directory go to it 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule (.*) - [L] 

# Else rewrite requests for non-existent resources to /index.php 
RewriteRule (.*) /index.php?q=$1 [L] 
Các vấn đề liên quan