2011-10-14 33 views
9

Tôi đang cố gắng chuyển hướng URL cơ bản cho URL đẹp và do hình ảnh, CSS, v.v. cũng nằm trong cùng một đường dẫn mà tôi cần đảm bảo rằng nếu URL là được truy cập mà không có dấu gạch chéo, nó được thêm tự động.Cách thực hiện chuyển hướng mod_rewrite sang URL tương đối

này hoạt động tốt nếu tôi đặt URL tuyệt đối như thế này:

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ http://www.mydomain.com/myParentDir/$1/ [R,nc,L] 

Nhưng nếu tôi thay đổi này đến một URL tương đối, vì vậy mà tôi không cần phải thay đổi nó mỗi khi tôi di chuyển những thứ trong các thư mục , điều này đơn giản là không hiệu quả.

Đây là những gì tôi đã cố gắng và tất cả không làm việc, hoặc chuyển hướng tôi đến đường dẫn thư mục nội bộ thực tế của máy chủ như/public_html/...:

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ ./myParentDir/$1/ [R,nc,L] 

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ myParentDir/$1/ [R,nc,L] 

đúng cách để làm một là gì chuyển hướng URL để nếu người dùng nhập vào một cái gì đó như:

http://www.mydomain.com/somedir/myVirtualParentDir/myVirtualSubdir 

ông được chuyển hướng đến (thông qua HTTP 301 hoặc 302):

http://www.mydomain.com/somedir/myVirtualParentDir/myVirtualSubdir/ 

Cảm ơn.

EDIT: Thêm một số chi tiết khác vì nó có vẻ không rõ ràng. Cho phép nói rằng tôi đang triển khai một thư viện và tôi muốn có các URL đẹp bằng cách sử dụng mod_rewrite. Vì vậy, tôi muốn có URL như sau:

http://www.mydomain.com/somedir/galleries/cats 

mà hiển thị thumbnail của mèo, trong khi:

http://www.mydomain.com/somedir/galleries/cats/persian 

trong đó cho thấy một hình ảnh từ hình thu nhỏ của tất cả những con mèo, tên là Ba Tư. Vì vậy, trong thực tế cấu trúc thư mục vật lý và viết lại sẽ như sau:

http://www.domain.com/somedir/gallery.php?category=cats&image=persian 

Vì vậy, những gì tôi muốn làm là đặt một tập tin .htaccess trong/somedir mà bắt tất cả các yêu cầu thực hiện để/phòng trưng bày và tùy thuộc vào thư mục con ảo sau đó, sử dụng chúng như placeholders trong viết lại, với các quy tắc 2 viết lại:

RewriteRule ^galleries/(A-Z0-9_-]+)/$ ./gallery.php?category=$1 [nc] 
RewriteRule ^galleries/(A-Z0-9_-]+)/+([A-Z0-9_-]+)$ ./gallery.php?category=$1&image=$2 [nc] 

Bây giờ vấn đề là kịch bản bộ sưu tập trên thực tế cần một số CSS, Javascript và hình ảnh, tọa lạc tại http://www.domain.com/somedir/css, http://www.domain.com/somedir/js, và http://www.domain.com/somedir/images tương ứng.

Tôi không muốn mã hóa bất kỳ URL tuyệt đối nào, vì vậy CSS, JS và Hình ảnh sẽ được giới thiệu bằng cách sử dụng các URL tương đối, (./css, ./js, ./images v.v.). Vì vậy, tôi có thể làm URL viết lại như sau:

RewriteRule ^galleries/[A-Z0-9_-]+/css/(.*)$ ./css/$1 [nc] 

Vấn đề là kể từ http://www.domain.com/somedir/galleries/cats là một thư mục ảo, bên trên chỉ hoạt động nếu sử dụng các loại:

http://www.domain.com/somedir/gallaries/cats/ 

Nếu người dùng bỏ qua các dấu gạch chéo mod_dir sẽ không thêm nó bởi vì trong thực tế thực tế thư mục này không thực sự tồn tại.

Nếu tôi đặt một viết lại chuyển hướng với các URL tuyệt đối hoạt động:

RewriteRule ^galleries/([A-Z0-9_-]+)$ http://www.mydomain.com/subdir/galleries/$1/ [R,nc,L] 

Nhưng tôi không muốn có tiền tố URL hardcoded vì tôi muốn để có thể đặt này trên bất cứ điều gì tôi muốn miền trong bất cứ subdir tôi muốn, vì vậy tôi cố gắng này:

RewriteRule ^galleries/([A-Z0-9_-]+)$ galleries/$1/ [R,nc,L] 

Nhưng thay vào đó nó chuyển hướng đến:

http://www.mydomain.com/home/myaccount/public_html/subdir/galleries/theRest 

mà rõ ràng không phải là những gì tôi muốn.

EDIT: làm rõ hơn nữa

Giải pháp Tôi đang tìm kiếm là để tránh hardcoding tên miền hay đường dẫn thư mục trong .htaccess. Tôi đang tìm một giải pháp mà nếu tôi gói các .htaccess với phần còn lại của các kịch bản và các nguồn lực, bất cứ nơi nào người dùng giải nén nó trên máy chủ web của mình nó hoạt động ra khỏi hộp. Tất cả các công trình như vậy ngoài vấn đề dấu gạch chéo sau này.

Vì vậy, mọi giải pháp liên quan đến việc mã hóa cứng thư mục mẹ hoặc đường dẫn của máy chủ web trong .htaccess theo bất kỳ cách nào không phải là những gì tôi đang tìm kiếm.

+0

@DoktorJ Bài chỉnh sửa của tôi có trả lời câu hỏi của bạn không? –

+0

Bạn nên chọn câu trả lời được chấp nhận, nếu có bất kỳ câu trả lời nào ở đây được trợ giúp. – sjas

Trả lời

0

Tôi không chắc mình có hiểu rõ vấn đề của bạn hay không.

Chuyển hướng dấu gạch chéo theo sau được thực hiện tự động trên hầu hết các cài đặt Apache vì mô-đun mod_dir (99% cơ hội bạn có mô-đun mod_dir).

Bạn có thể cần thêm:

DirectorySlash On 

Nhưng đó là giá trị mặc định.

So. Nếu bạn truy cập foo/bar và thanh không phải là tệp trong thư mục foo nhưng một thư mục con thì mod_dir sẽ thực hiện chuyển hướng đến foo/bar/.

Điều duy nhất tôi biết có thể phá vỡ đây là Option Multiviews có thể đang cố gắng kết thúc một bar.php, bar.php, bar.a-mime-extension-knwon-by-apache trong thư mục. Vì vậy, bạn có thể thử thêm:

Option -Multiviews 

Và xóa tất cả viết lạiRules. Nếu bạn không nhận được hành vi Apache mặc định này, bạn có thể phải xem xét mod-rewrite, nhưng nó giống như sử dụng một quả bom hạt nhân để giết một con nhện. Bom hạt nhân có thể khá nhạy cảm để sử dụng tốt.

EDIT: Đối với vấn đề gạch chéo với mod-viết lại bạn có thể kiểm tra documentation howto này, trong đó nêu này nên làm việc:

RewriteEngine on 
RewriteBase /myParentDir/ 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.+[^/])$   $1/ [R] 
+0

Cảm ơn bạn đã trả lời. Tuy nhiên, hãy nhớ rằng đây không phải là thư mục thực tế. Những thực tế này không tồn tại và chỉ là các thư mục ảo cho các URL đẹp. Vì vậy, trên thực tế, URL: http://www.mydomain.com/somedir/myVirtualParentDir không tồn tại. Nếu không có nó tôi nhận được các liên kết tương đối với hình ảnh vv không hợp lệ. – jbx

+0

Tại sao bạn lại bao gồm RewriteBase? Đó là toàn bộ vấn đề tôi muốn tránh. Tôi không muốn hardcode đường dẫn trong .htaccess của tôi. Tôi muốn một cái gì đó mà làm việc trong bất kỳ phụ dir tôi đặt nó. Điều này không khác với việc chỉ định đường dẫn đầy đủ là http://www.mydomain.com/myParentDir/ trong chuyển hướng mà tôi không muốn. Phần còn lại là chính xác giống như vấn đề ban đầu của tôi, trong đó $ 1/đang chuyển hướng đến URL vật lý thực tế không phải là URL ảo.Những gì bạn đang đề xuất sẽ chỉ chuyển hướng đến myParentDir/theRest vật lý thay vì/myVirtualDir/theRest. – jbx

+0

@jbx: đọc liên kết, điều này phải được đặt trên thư mục cấp cao nhất và hoạt động cho tất cả các thư mục con con. – regilero

4

Dưới đây là một giải pháp trực tiếp từ Apache Documentation (dưới "Trailing Vấn đề Slash"):

RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.+[^/])$   $1/ [R] 

Dưới đây là a solution đó kiểm tra các REQUEST_URI cho một dấu gạch chéo, sau đó thêm nó:

RewriteCond %{REQUEST_URI} !(/$|\.) 
RewriteRule (.+) http://www.example.com/$1/ [R=301,L] 

Dưới đây là another solution cho phép bạn miễn mẫu REQUEST_URI chắc chắn:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !example.php 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ http://domain.com/$1/ [L,R=301] 

Hy vọng những sự giúp đỡ. :)

1

này sức công việc:

RewriteRule ^myParentDir/[A-Z0-9_-]+$ %{REQUEST_URI}/ [NS,L,R=301] 

Tuy nhiên, tôi không chắc chắn lý do tại sao bạn nghĩ rằng bạn cần điều này chút nào. Chỉ cần chắc CSS/JS/tập tin ảnh viết lại quy tắc của bạn trông giống như thế này:

RewriteRule ^galleries/([A-Za-z0-9_-]+/)*(css|js|images)/(.*)$ ./$2/$3 

và tất cả mọi thứ nên chỉ làm việc tốt bất kể trình duyệt yêu cầu /somedir/galleries/css/whatever.css hoặc /somedir/galleries/cats/css/whatever.css hoặc thậm chí /somedir/galleries/cats/persian/calico/css/whatever.css.

Ps. Một vấn đề với quy tắc này là nó ngăn cản bạn có bất kỳ tên phòng trưng bày "css", "js" hoặc "hình ảnh". Bạn có thể muốn khắc phục điều đó bằng cách đặt tên cho các thư mục ảo đó như ".css", ".js" và ".images" hoặc sử dụng một số lược đồ đặt tên khác không xung đột với tên thư viện hợp lệ.

2

Quy tắc này sẽ thêm dấu gạch chéo vào bất kỳ URL nào không phải là tệp/thư mục thực (tức là tôi tin rằng, những gì bạn cần vì Apache thường tự động chuyển hướng cho các thư mục hiện có).

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+[^/])$ $1/ [L,R=301] 

Edit:

Để ngăn chặn Apache từ phụ thêm đường dẫn tương đối đến thư mục gốc tài liệu, bạn phải sử dụng RewriteBase. Vì vậy, ví dụ: trong thư mục có nghĩa là gốc của ứng dụng, bạn thêm thông tin sau, ghi đè đường dẫn vật lý:

RewriteBase/
+0

Dường như mẹo sử dụng RewriteBase là có cả dấu gạch ngang * và * dấu gạch chéo; ví dụ: "/ foo /" thay vì "/ foo" hoặc "foo /". RewriteBase vẫn khá là khó chịu đối với tôi, nhưng cuối cùng nó đã thành công. Cảm ơn! –

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