2011-10-15 24 views
5

Tôi đang gặp một chút khó khăn trong việc tìm ra điều gì đó đơn giản. Tôi muốn 301 chuyển hướng mọi thứ trong một thư mục tới một tệp duy nhất ở một vị trí mới.Chuyển hướng 301 từ một Thư mục tới một Tệp Đơn

Trong .htaccess của tôi, tôi đã cố gắng sau ...

Redirect 301 /myDir/ http://www.mydomain.com/myNewDir/index.html 

và điều này ...

Redirect 301 /myDir/ http://www.mydomain.com/myNewDir/ 

và điều này ...

Redirect 301 /myDir http://www.mydomain.com/myNewDir 

Các vấn đề là mỗi trong số đó chỉ đơn giản là ánh xạ từng tệp trong /myDir/ và thêm nó vào cuối URL đích.

Sau Googling, tôi thấy cái gì mà nói để làm điều này ...

Redirect 301 ^/myDir(.*) http://www.mydomain.com/myNewDir 

Nhưng điều đó chỉ làm điều tương tự ... nó lập bản đồ vị trí tệp hiện có vào cuối URL.

Thật dễ dàng khi tìm thấy rất nhiều hướng dẫn trực tuyến, nhưng dường như chỉ hiển thị các ví dụ rõ ràng như 'ánh xạ một đối một' hoặc 'ánh xạ thư mục một-một ". Những hướng dẫn này cũng dường như bỏ bê giải thích các chỉ thị tập tin có liên quan khác nhau và cách sử dụng chúng đúng cách.

Tài khoản lưu trữ đặc biệt này là rác và cũng đã cài đặt tiện ích FrontPage. Mod-viết lại không thành công (phá vỡ toàn bộ trang web) nhưng các dòng Redirect 301 đang hoạt động tốt. Vì vậy, cho đến khi tôi có thể di chuyển trang web mới (không phải FrontPage) này sang một tài khoản lưu trữ mạnh mẽ hơn, tôi sẽ cần phải gắn bó với một lớp lót Redirect 301.


Làm thế nào tôi có thể chỉ cần sử dụng một Redirect 301 để chuyển hướng mọi thứ trong /myDir/ đến cùng tập tin duy nhất tọa lạc tại /myNewDir/index.html? (Tôi muốn sử dụng chỉ /myNewDir/ nếu có thể). Vui lòng giải thích chi tiết các chỉ dẫn tệp được sử dụng trong giải pháp của bạn.


UPDATE:

Trước đây chấp nhận câu trả lời là không làm việc.

Ví dụ:

RedirectMatch 301 /myDir1/(.*) http://mydomain.org/newpath/myDir1/index.html 

... được đưa ra một "Quá nhiều chuyển hướng xảy ra cố gắng mở" lỗi.

Điều này là do /myDir1/(.*) là phù hợp với bất cứ nơi nào trong chuỗi vì vậy nếu URL mục tiêu chứa /myDir1/ bất cứ nơi nào, không chỉ là root, nó sẽ được chuyển vào một vòng lặp khó chịu.

Xem câu trả lời đã đăng của riêng tôi để có giải pháp đúng.

Trả lời

12

Tôi đã tìm thấy câu trả lời trong một trong các dự án cũ của mình.

Redirect 301 là tất cả đều sai đối với điều này. Tôi thực sự muốn thay vào đó là RedirectMatch 301.

RedirectMatch 301 ^/myDir/(.*) http://www.mydomain.com/myNewDir/ 

Giải thích (s):

http://httpd.apache.org/docs/1.3/mod/mod_alias.html#redirectmatch

"Chỉ thị này là tương đương với Chuyển, nhưng tận dụng chuẩn biểu thức thông thường, thay vì phù hợp với tiền tố đơn giản"

http://www.zytrax.com/tech/web/regex.htm

"The^(circumflex hoặc caret) bên ngoài dấu ngoặc vuông có nghĩa là chỉ nhìn vào đầu của chuỗi mục tiêu, ví dụ,^Win sẽ không tìm thấy Windows trong STRING1 nhưng^Moz sẽ tìm thấy Mozilla. "

và ...

"The. (Thời gian) có nghĩa là bất kỳ ký tự (s) ở vị trí này, ví dụ, tấn. Sẽ tìm thấy tấn, giai điệu và tonneau nhưng không bừa bãi bởi vì nó không có ký tự sau. "

và ...

Các * (dấu sao hoặc sao) phù hợp với nhân vật trước 0 hoặc nhiều lần, ví dụ, tre sẽ tìm cây (2 lần) và bước đi (1 lần) và máng (0 lần). *

+0

Rất cảm ơn bạn. Điều này đã bắt đầu khiến tôi phát điên. Điều này làm việc để chỉ đạo nội dung của toàn bộ thư mục (mỗi trang bên trong) đến một trang nhất định. – Tom

+0

Cũng đáng nói rằng nếu trước đây bạn đã chuyển hướng 301 đến địa điểm sai (thêm trang vào URL đích), bạn có thể cần xóa bộ nhớ cache của trình duyệt trước khi nó sẽ nhận quy tắc mới từ .htaccess. – Russ

1

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

RedirectMatch 301 /myDir/.* http://www.mydomain.com/myNewDir/index.html 

tham khảo: http://httpd.apache.org/docs/1.3/mod/mod_alias.html#redirectmatch.

Theo như dấu ngoặc xung quanh. * Là có liên quan, RedirectMatch sử dụng biểu thức thông thường tiêu chuẩn, có nghĩa là bạn có thể chụp các nhân vật phù hợp và sử dụng chúng trong quy tắc chuyển hướng của bạn refferencing chúng như $ 1, $ 2, vv

Trong thường xuyên biểu thức * có nghĩa là bất kỳ số lần lặp lại nào của ký tự trước đó. . - biểu thị bất kỳ ký tự nào. Vì vậy, sự kết hợp. * Nói rằng mẫu này khớp với bất kỳ số nào của bất kỳ ký tự nào. Vì thế * . * có nghĩa là mẫu này sẽ khớp với/myDir và/myDir /, và vẫn là /myDir/test.html. Vì thế * . * cũng có thể được sử dụng

+0

Có, hoạt động. Tôi biết rằng '. *' Khớp với tất cả các tệp. Nhưng bạn có thể mở rộng khi đó? Bất kỳ biến thể nào? Tại sao '(. *)' Cũng hoạt động? Một liên kết đến tài liệu trực tuyến về điều này? Cảm ơn bạn! – Sparky

+0

Xem: http://httpd.apache.org/docs/1.3/mod/mod_alias.html#redirectmatch Giới thiệu về các dấu ngoặc xung quanh.* RedirectMatch sử dụng các biểu thức chính quy chuẩn, có nghĩa là bạn có thể chụp các ký tự phù hợp và sử dụng chúng trong quy tắc chuyển hướng của bạn để xem lại chúng dưới dạng $ 1, $ 2, v.v. – dfsq

+0

Trong biểu thức chính quy * có nghĩa là bất kỳ số lần lặp lại nào của ký tự trước đó. '.' - biểu thị bất kỳ characher nào. Vì vậy, sự kết hợp. * Nói rằng mẫu này khớp với bất kỳ số nào của bất kỳ ký tự nào. Vì thế * . * có nghĩa là mẫu này sẽ khớp với/myDir và/myDir /, và vẫn là /myDir/test.html. Vì thế * . * cũng có thể được sử dụng. – dfsq

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