2011-11-08 26 views
5

Tôi đã đào cao và thấp xung quanh Google và StackOverflow để thử và tìm ra vấn đề của mình, thử vô số giải pháp nhưng không có gì hoàn toàn hoạt động.htaccess Chuyển hướng Im lặng sang Subdirectory: Subdirectory hiển thị khi không có dấu '/'

Tôi đang tìm cách di chuyển gốc web của tên miền chính trên máy chủ của tôi sang thư mục con. Những gì tôi hiện có cho một con đường server để rễ web của tôi:

/home/user/public_html/MyWebFilesHere 

Những gì tôi đang tìm cách để có:

/home/user/public_html/subdir/MyWebfilesHere 

Khi tôi duyệt đến mydomain.com, không nên có sự khác biệt rõ ràng mặc dù (tức là "subdir" không hiển thị sau khi chuyển hướng).

Thật không may, tôi bị hạn chế làm điều này hoàn toàn với tệp .htaccess kể từ khi tôi đang ở trên lưu trữ được chia sẻ và không có quyền truy cập vào tệp cấu hình Apache và như vậy. :(

Những gì tôi hiện có trong .htaccess của tôi trong public_html là:

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^(www\.)?mydomain\.com$ 
RewriteCond %{REQUEST_URI} !^/subdir/ 
RewriteRule ^(.*)$ /subdir/$1 [L] 

này chuyển hướng thành công tất cả các truy vấn đến các thư mục con, tuy nhiên có một vấn đề thực sự lạ Nếu tôi đi đến

.
mydomain.com/Contact/ 

nó hoạt động tuyệt vời, chuyển hướng các truy vấn đến đường dẫn/subdir/Liên hệ/nhưng lại thanh địa chỉ một mình. Nếu tôi đi đến

mydomain.com/Contact 

(Lưu ý việc thiếu một dấu '/') Mặc dù vậy, những gì thể hiện trong thanh địa chỉ là

mydomain.com/subdir/Contact/ 

mà không phải là những gì tôi muốn vì "subdir" được hiển thị.

Đối với một ví dụ làm việc trên trang web thực tế của tôi, hãy thử duyệt tới

colincwilliams.com/Contact/ 

so với

colincwilliams.com/Contact 

Do you guys có bất kỳ ý tưởng về làm thế nào để làm cho công việc này âm thầm cả có và không có một dấu gạch chéo?

Trả lời

7

Điều này có thể xảy ra do mod_dir (mô-đun sẽ tự động chuyển hướng trình duyệt nếu yêu cầu thư mục bị thiếu dấu gạch chéo theo cùng một điều với dấu gạch chéo.Xem DirectorySlash directive in mod_dir

gì đang xảy ra là:

  1. Bạn yêu cầu: mydomain.com/Contact
  2. mod_dir không chạm này kể từ /Contact không phải là một thư mục
  3. /Contact được viết lại để /subdir/Contactnội chuyển hướng
  4. mod_dir thấy rằng /subdir/Contact là một thư mục và thiếu dấu dấu gạch chéo sao cho nó chuyển hướng trình duyệt đến mydomain.com/subdir/Contact/
  5. Vì vậy, bây giờ, thanh vị trí của trình duyệt của bạn có/subdir/in it.

Bạn có thể thêm DirectorySlash off trong .htaccess để tắt mod_dir khỏi chuyển hướng. Nhưng nếu bạn muốn các thư mục có dấu gạch chéo, bạn có thể thêm một điều kiện riêng cho nó. Dựa trên những gì bạn đã có, chúng ta có thể mở rộng nó như thế này:

RewriteEngine on 

# Has a trailing slash, don't append one when rewriting 
RewriteCond %{HTTP_HOST} ^(www\.)?mydomain\.com$ 
RewriteCond %{REQUEST_URI} !^/subdir/ 
RewriteCond %{THE_REQUEST} ./\ HTTP/1\.[01]$ [OR] 
# OR if it's a file that ends with one of these extensions 
RewriteCond %{REQUEST_URI} \.(php|html?|jpg|gif|css)$ 
RewriteRule ^(.*)$ /subdir/$1 [L] 

# Missing trailing slash, append one 
RewriteCond %{HTTP_HOST} ^(www\.)?mydomain\.com$ 
RewriteCond %{REQUEST_URI} !^/subdir/ 
RewriteCond %{THE_REQUEST} [^/]\ HTTP/1\.[01]$ 
# But only if it's not a file that ends with one of these extensions 
RewriteCond %{REQUEST_URI} !\.(php|html?|jpg|gif|css)$ 
RewriteRule ^(.*)$ /subdir/$1/ [L] 

Lưu ý: Tôi đã thay đổi !^/mydomain/-!^/subdir/, figured nó đã được một lỗi đánh máy vì không có nó, mod_rewrite sẽ lặp nội bộ vô thời hạn (foo ->/subdir/foo ->/subdir/subdir/foo ->/subdir/subdir/subdir/foo, v.v.) Nếu tôi hiểu sai, bạn có thể đổi lại.

Chỉnh sửa: Xem các bổ sung của tôi về kết hợp RewriteCond với \.(php|html?|jpg|gif|css). Đây là những phần mở rộng tập tin mà có được thông qua mà không nhận được dấu gạch chéo dấu cộng thêm. Bạn có thể thêm/xóa cho phù hợp với nhu cầu của mình.

+0

Jon Lin, câu trả lời của bạn là siêu hữu ích và thực hiện một tấn tinh thần. Cảm ơn! Nó đã làm việc (gợi ý thứ hai thêm dấu gạch chéo), ngoại trừ nó bây giờ đã phá vỡ các liên kết CSS của tôi vì một lý do nào đó. Chúng được định dạng là "/CSS/core-style.css" nhưng đang trả về 404. –

+0

Sau một lần điều tra, có vẻ như các liên kết CSS đang bỏ qua tệp htaccess; "/ CSS/..." đang tìm kiếm trực tiếp trong thư mục public_html cho CSS/thay vì đi vào thư mục con. –

+0

Ồ, quên bạn cần phải loại trừ các tệp khỏi phần tử "/" theo sau. Xem chỉnh sửa của tôi –

0

Câu trả lời của Jon Lin rất hữu ích trong việc xác định nguyên nhân gây ra sự cố trong thiết lập tương tự của tôi. Để hoàn thành, tôi sẽ bao gồm thông tin có liên quan từ câu trả lời của anh ấy:

Điều này có thể xảy ra vì mod_dir (mô-đun tự động chuyển hướng trình duyệt nếu yêu cầu thư mục bị thiếu dấu gạch chéo theo cùng một dấu slash Xem DirectorySlash directive in mod_dir

gì đang xảy ra là:.

  1. Bạn yêu cầu: mydomain.com/Contact
  2. mod_dir không chạm này kể từ.210 không phải là một thư mục
  3. /Contact được viết lại để /subdir/Contact và trong nội bộ chuyển hướng
  4. mod_dir thấy rằng /subdir/Contact là một thư mục và thiếu dấu gạch chéo để nó chuyển hướng trình duyệt để mydomain.com/subdir/Contact/
  5. Vì vậy, bây giờ, thanh địa chỉ của trình duyệt của bạn có/subdir/trong đó.

Trong trường hợp của tôi, tôi đã yêu cầu được chuyển đến /subdir với một vài trường hợp ngoại lệ và không muốn phải kích hoạt lại DirectorySlash cho mỗi người trong số những trường hợp ngoại lệ.

Bằng cách cho phép RewriteEngine tiếp tục sau khi chuyển hướng ban đầu sang /subdir, bạn có thể bắt chước những gì mod_dir sẽ thực hiện trong khi cũng lấy /subdir vào tài khoản, trước khi mod_dir được xem.

RewriteEngine on 

RewriteCond %{REQUEST_URI} !^/exception1|exception2|... 
RewriteRule ^(.*)$ /subdir/$1 

RewriteCond %{REQUEST_FILENAME} -d 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^subdir/(.*) $1/ [R,L] 

Lưu ý: Bạn có thể cần phải cẩn thận về việc cho phép RewriteEngine tiếp tục nếu có các quy tắc khác. Không phù hợp với quy tắc thứ hai sẽ tiếp tục với bất kỳ quy tắc nào khác có thể tạo ra kết quả khác.

này có thể tránh được bằng cách sử dụng một quy tắc thứ ba để ngăn chặn xử lý RewriteEngine nếu chuyển hướng vào /subdir đã xảy ra:

RewriteCond %{REQUEST_URI} ^subdir 
RewriteRule .* - [L] 
Các vấn đề liên quan