2009-07-22 32 views
15

Tôi đang cố gắng sử dụng RewriteRules trong .htaccess với đường dẫn tương đối, nhưng Apache dường như muốn xuất ra đường dẫn vật lý thay vì đường dẫn máy chủ bất cứ khi nào tôi cố gắng tạo đường dẫn tương đối. Đường dẫn tuyệt đối và máy chủ gốc hoạt động tốt. Ví dụ:Tại sao RewriteRule của Apache tiết lộ các đường dẫn cục bộ?

RewriteEngine On 

# this works fine, 127.0.0.1/ab redirects to 127.0.0.1/cd 
RewriteRule ^ab$ /cd [R] 

# this doesn't work... 127.0.0.1/wx redirects to 127.0.0.1/C:/path/to/files/yz 
RewriteRule ^wx$ yz [R] 

Thêm một "RewriteBase /" giải quyết vấn đề, nhưng nó tẻ nhạt để thêm đường dẫn đến mỗi .htaccess, và nó làm cho nó khó khăn hơn để thay đổi cấu trúc thư mục. Có lý do RewriteBase mặc định cho đường dẫn vật lý hiện tại thay vì đường dẫn URI hiện tại không?

Trả lời

5

Đó là vì [R] có nghĩa là máy chủ sẽ chuyển hướng đến đường dẫn mới (do đó trình duyệt của người dùng sẽ gửi yêu cầu mới với uri mới được gửi) thay vì dịch URI nội bộ sang đường dẫn cục bộ.

Trong RewriteRule đầu tiên của bạn, có dấu gạch chéo trong đường dẫn mới, do đó máy chủ không cố dịch nó sang đường dẫn cục bộ, nhưng trong quy tắc thứ hai, không có dấu gạch chéo, đây là lý do nó chuyển hướng đến một con đường địa phương hoàn chỉnh. Điều này giải thích tại sao nó hoạt động với tập RewriteBase.

Xóa [R] (bạn có thể thay thế [L] trong trường hợp của bạn, điều này tránh máy chủ cố gắng khớp với các quy tắc khác khi tìm thấy một quy tắc phù hợp) hoặc thêm dấu gạch chéo trước "yz" trong RewriteRule thứ hai của bạn.

Tôi đề nghị chỉ cần thay thế [R] bằng [L]: theo cách này, người dùng sẽ không nhìn thấy đường dẫn viết lại, thường là những gì RewriteRules dự định làm (chủ yếu cho mục đích SEO), trừ khi bạn đặc biệt muốn chuyển hướng người dùng của mình đến một URL mới.

+0

Tôi muốn chuyển hướng thực sự đến đường dẫn mới - Tôi đang sử dụng điều này để tạo URL tắt và sửa lỗi chính tả. Có cách nào để tránh đặt RewriteBase theo cách thủ công trong mọi tệp .htaccess không? – zildjohn01

+0

Nói chung, bạn không cần thay đổi 'RewriteBase'. Chỉ cần sử dụng đường dẫn tương đối cho đường dẫn nội bộ và tuyệt đối cho các chuyển hướng bên ngoài. – Gumbo

+1

Bạn có thể minh họa ý của mình không? Trong mã của tôi, tôi đã sử dụng một đường dẫn tương đối cho một chuyển hướng nội bộ, và nó kết thúc với hành vi không mong muốn mà tôi đã mô tả. – zildjohn01

12

Đối với những người tình cờ đến đây từ Google (như tôi), danh sách kiểm tra ngắn:

  • Đảm bảo bạn có RewriteBase / (hoặc bất kỳ giá trị khác - tuyên bố là những gì là quan trọng)

  • Nếu bạn sử dụng chuyển hướng ([R], [R=30x], vv) - đảm bảo URI mới bắt đầu với một / và chứa một đường dẫn tương đối đến thư mục gốc tên miền của bạn

  • (Nếu trên không giúp nào) Khởi động lại Apache, xóa bộ nhớ cache của trình duyệt của bạn (đặc biệt nếu bạn đã sử dụng [R=301] tại một số điểm)

Đó là những gì lưu ngày của tôi, có lẽ nó sẽ tiết kiệm của bạn quá.

+0

Có. Giúp tôi. –

+0

rewritebase/help. Cảm ơn – OzzyTheGiant

0

Hãy thử điều này và cho tôi biết kết quả:
# này không làm việc ... 127.0.0.1/wx chuyển hướng đến 127.0.0.1/C:/path/to/files/yz

RewriteRule^wx $/yz [R]

đặt/trước yz.

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