2011-07-21 46 views
6

Tôi đang trong quá trình dọn sạch cấu trúc thư mục của miền của mình (woe được với tôi để thiết lập nội dung url gốc trong thư mục gốc!) Và cần một số thông tin chi tiết về cách sử dụng RewriteRule một cách chính xác..htaccess: Chuyển hướng url gốc sang thư mục con, nhưng giữ lại url gốc

Các Gist

Tôi muốn domain.tld sử dụng domain.tld/thư mục con/ nhưng vẫn xuất hiện như domain.tld trong url.

.htaccess My So Far

Options +FollowSymlinks 
RewriteEngine On 

#Force removal of wwww subdomain 
RewriteBase/
RewriteCond %{HTTP_HOST} ^www.domain.tld 
RewriteRule ^(.*)$ http://domain.tld/$1 [R=301,L] 

#Trailing slash 
RewriteRule ^/*(.+/)?([^.]*[^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301] 

#Redirect root url to subdirectory 
RedirectMatch 301 ^/subdirectory/$ http://domain.tld/ 
RewriteRule ^/$ /subdirectory/?$ [L] 

Các RedirectMatch hoạt động tuyệt vời. Thật không may, t có vẻ như RewriteRule cuối cùng có nên hoạt động đơn giản, nhưng không. Thiết lập nội dung cũ trong thư mục gốc vẫn xuất hiện.

Tôi thiếu gì ở đây?

Cập nhật: Resolved

sửa chữa đơn giản rằng tôi không đủ kinh nghiệm với .htaccess/apache để có thể giải thích tại sao.

tôi đã:

RewriteRule ^/$ /subdirectory/?$ [L] 

Loại bỏ một dấu gạch chéo tất cả những gì cố định:

RewriteRule ^$ /subdirectory/?$ [L] 

Vì vậy, bây giờ câu hỏi của tôi là: tại sao vậy?

Trả lời

0

Phần URI trong một RewriteRule không chứa dấu gạch chéo trước.

Vì vậy, để đối sánh http://example.com/ bạn phải sử dụng RewriteRule ^$ trong đó RewriteRule ^/$ về mặt lý thuyết sẽ khớp với http://example.com// (ghi chú dấu gạch chéo kép).

Bổ sung: ?$ ở cuối không có ý nghĩa gì, vì điều này sẽ thêm chuỗi truy vấn có thông số trống $.

Cuối cùng bạn có: RewriteRule ^$ /subdirectory/ [L,QSA]

0

Cả hai quy tắc là HỢP LỆ:

này một được sử dụng trong cấu hình máy chủ hoặc bối cảnh máy chủ ảo (URL bắt đầu với dấu gạch chéo hàng đầu):

RewriteRule ^/$ /subdirectory/ [L] 

Nếu bạn đặt cùng một quy tắc trong .htaccess, sau đó bạn phải gỡ bỏ hàng đầu dấu gạch chéo (vì nó là tương đối so với thư mục hiện hành):

RewriteRule ^$ /subdirectory/ [L] 

T.B. Floern đã đề cập đến khoảng ?$ nó nhắm mục tiêu phần URL. Không cần thiết cho $. Nếu bạn hoàn thành URL của mình với ?, điều này sẽ yêu cầu Apache không chuyển chuỗi truy vấn sang URL mới (chuỗi truy vấn thả hoàn toàn).

Ngoài ra, chỉ cần [QSA] cờ nếu bạn thao tác với chuỗi truy vấn (có ? trong URL mục tiêu) và vẫn muốn chuỗi truy vấn hiện tại của bạn được nối vào URL mới xây dựng. Điều này có nghĩa là trong quy tắc này, RewriteRule ^$ /subdirectory/ [L,QSA] cờ [QSA] không làm gì cả và có thể xóa an toàn.

1

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

RewriteEngine on 
RewriteBase/

RewriteCond %{REQUEST_URI} !^/subdirectory/ 

# REWRITES ALL URLS 
# [REPLACE "domain" WITH THE ACTUAL DOMAIN, 
# WITHOUT THE TLD (.com, .net, .biz, etc)] 
RewriteCond %{HTTP_HOST} ^(www\.)?domain\. 

# REWRITE ALL THOSE TO subdirectory 
RewriteRule ^(.*)$ /subdirectory/$1 [L] 

BR Spiros

0

tôi đã cố gắng giải pháp nhưng trong trường hợp của tôi loại bỏ/thư mục/NHƯNG hiển thị trang web cũ (www.site.it) và không phải là www .site.it/folder/với 'thư mục' đã bị xóa ... tôi đã sao chép và dán cùng một mã nhưng không hoạt động trong trường hợp của tôi: (tôi đã mở một chủ đề mới: .htaccess: Redirect root wordpress url to another wordpress in a subdirectory, but retain root url

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