.htaccess viết lại để chuyển hướng URL gốc sang thư mục con


246

Đang cố gắng đạt được

www.example.com

đi trực tiếp đến

www.example.com/store

Tôi đã thử nhiều bit mã và không có công việc nào.

Những gì tôi đã thử:

Options +FollowSymlinks
RewriteEngine on

RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^(.+)\www.example\.com$
RewriteRule ^/(.*)$ /samle/%1/$1 [L]

Tôi đang làm gì sai?

Câu trả lời:


275

Bạn có thể sử dụng quy tắc viết lại sử dụng ^ $ để thể hiện gốc và viết lại quy tắc đó vào thư mục / store của bạn, như thế này:

RewriteEngine On
RewriteRule ^$ /store [L]

6
RewriteRule ^ /? $ /Index.do [R]
barclay

2
^ / $ dường như không bao giờ khớp nên tôi đoán ^ /? $ không cần thiết.
NateS

Có thể sau đó hiển thị url đầy đủ và tiếp tục xử lý quy tắc? Trong trường hợp của tôi, tôi viết lại một số url để chúng đẹp. Điều này giữ url example.com - Tôi muốn example.com/store và sau đó tiếp tục với các bản viết lại khác.
gin93r

Làm việc tốt cho tôi quá.
Jitesh Sojitra

1
Gần đây tôi đã dành rất nhiều thời gian để gỡ lỗi tại sao điều này không hoạt động trên một trang web trong Ubuntu Apache 2.4.7. Gỡ lỗi viết lại cho thấy quy tắc bị tấn công và tạo ra một GIẢM GIÁ NỘI BỘ. Sau đó, nó dường như chỉ đậu nó và tìm kiếm một trang chỉ mục. Hóa ra nếu mod_dir được bật VÀ có một ứng cử viên trang chỉ mục trong thư mục thì nó sẽ ghi đè lên mod_rewrite, UNLESS bạn đã đặt: DirectoryCheckHandler On
Gerrit

142

Tôi đã ngạc nhiên khi không ai đề cập đến điều này:

RedirectMatch ^/$ /store/

Về cơ bản, nó chuyển hướng gốc và chỉ URL gốc. Câu trả lời bắt nguồn từ liên kết này


3
cảm ơn, điều này làm việc rất tốt cho tôi với một quy tắc đã tồn tại. không có xung đột.
thescientist

1
Điều này hoạt động hoàn hảo. Ngoài ra, nó bao gồm cả http và https.
Sayem Shafayet 17/05/2015

3
Và điều này cho chuyển hướng 301:RedirectMatch 301 ^/$ /store/
Andrea

Vâng, nó đơn giản hơn với việc viết lại. Cảm ơn!
Orden

2
@Andrea Và điều này cho 302 chuyển hướng tạm thời: RedirectMatch 302 ^ / $ / store /
Faizan Anwer Ali Rupani

108

Thử cái này:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
RewriteRule ^$ store [L]

Nếu bạn muốn chuyển hướng bên ngoài (khiến trình duyệt truy cập hiển thị URL được chuyển hướng), hãy đặt Rcờ ở đó:

RewriteRule ^$ /store [L,R=301]

4
Điều đó làm việc rất đẹp. Cả sample.com và www.sample.com đều chuyển hướng đến www.sample.com/store. Đó chỉ là những gì tôi muốn. Cảm ơn bạn Gumbo, và tất cả những người đã trả lời. Tôi đã học được rất nhiều đọc phản hồi của bạn và đánh giá cao thông tin phản hồi.

1
Tôi tò mò, liệu chương trình này có phải www.example.comlà URI sau khi chuyển hướng không? Nếu không, làm thế nào nó sẽ được thay đổi để làm như vậy?
stefmikhail

1
♦ - Và tại sao giải pháp của bạn sẽ tốt hơn Sander dưới đây? Tôi nhận thấy dòng cuối cùng của bạn là như nhau, nhưng nếu đó là tất cả những gì cần thiết, tại sao bao gồm RewriteCondvà dòng đầu tiên RewriteRule?
stefmikhail

nếu mã này được sử dụng, bạn có thể nhập vào trình duyệt của mình exmple.com/../aboveSubDir không?

@GamErix Điều này sẽ được giải quyết /aboveSubDirbằng trình duyệt hoặc bởi máy chủ.
Gumbo

79

Đây là những gì tôi đã sử dụng để chuyển hướng đến một thư mục con. Điều này đã làm nó vô hình và vẫn cho phép thông qua các yêu cầu khớp với tệp hiện có hoặc bất cứ thứ gì.

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?site.com$
RewriteCond %{REQUEST_URI} !^/subdir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /subdir/$1
RewriteCond %{HTTP_HOST} ^(www.)?site.com$
RewriteRule ^(/)?$ subdir/index.php [L]

Thay đổi trang web.com và subir với các giá trị của bạn.


Hoạt động như mong đợi! Tuyệt quá!
kachar

trang chủ là 'tàng hình' ... nhưng một khi tôi nhấp vào một liên kết, tên của thư mục con sẽ hiển thị trên thanh địa chỉ ... có cách nào để ngăn tên của thư mục con hiển thị không?
dsdsdsdsd

4
chỉ root - không làm thư mục con
php-b-grader

3
Đối với tôi, nó cung cấp "Lỗi máy chủ nội bộ": /
Pithikos

1
Cảm ơn bạn rất nhiều, bạn không biết chính xác tôi đã tìm kiếm điều này bao lâu.
Cơ sở mong muốn

26

Để đặt chuyển hướng vô hình từ thư mục gốc sang thư mục con, Bạn có thể sử dụng RewriteRule sau trong /root/.htaccess:

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/subfolder
RewriteRule ^(.*)$ /subfolder/$1 [NC,L]

Quy tắc trên sẽ chuyển hướng nội bộ trình duyệt từ:

đến

đến

trong khi trình duyệt sẽ ở trên thư mục gốc.


1
Đây phải là câu trả lời được chấp nhận ... RewriteRule cùng (như được đề xuất trong một số câu trả lời khác) gây ra chuyển hướng vô hạn, vì / thư mục con được chuyển hướng đến / thư mục con / thư mục con, v.v ... RewriteCond% {REQUEST_URI}! ^ / Thư mục con đảm bảo rằng nếu một URL đã được chuyển hướng, nó sẽ không được thực hiện lại
patrick

21

Một cách khác nếu bạn muốn viết lại URL và ẩn URL gốc:

RewriteEngine on
RewriteRule ^(.*)$ /store/$1 [L]

Với điều này, nếu bạn lấy ví dụ http://www.example.com/product.php?id=4, nó sẽ mở tệp trong suốt http://www.example.com/store/product.php?id=4nhưng không hiển thị cho người dùng url đầy đủ.


2
Thêm QSA(nối chuỗi truy vấn) vào [L]( [L, QSA]) nếu bạn muốn các chuỗi truy vấn được chuyển sang url được viết lại.
devios1

@chaiguy cảm ơn vì tiền boa, nhưng trên máy chủ của tôi, nó hoạt động mà không có QSA (nhưng tôi đồng ý có lẽ tốt hơn để nối QSA). Có lẽ đó là do một số cấu hình đặc biệt của máy chủ apache của tôi?
gabious

1
Phương pháp này đối với tôi, example.com hiển thị nội dung từ example.com/store trong suốt nhưng example.com/test chuyển hướng đến example.com/store/test, hiển thị url
Geoffrey Hale

14

Đây dường như là giải pháp đơn giản nhất:

RewriteEngine on
RewriteCond %{REQUEST_URI} ^/$
RewriteRule (.*) http://www.example.com/store [R=301,L]

Tôi đã nhận được các vòng chuyển hướng với một số giải pháp khác.


2
cái này không ẩn thư mục
php-b-grader

8

Tôi không hiểu câu hỏi của bạn ...

Nếu bạn muốn chuyển hướng mọi yêu cầu đến thư mục con:

RewriteRule ^(.*)$ shop/$1 [L,QSA]

http://www.example.com/* -> wwwroot/store/*

Nếu bạn muốn chuyển hướng đến thư mục con có tên miền

RewriteCond %{HTTP_HOST} ([^\.]+\.[^\.]+)$
RewriteRule ^(.*)$ %1/$1 [L,QSA]

http://www.example.com/* -> wwwroot/example.com/*

Tôi thích mã của bạn ([^\.]+\.[^\.]+)$để dự trữ tên miền như tên thư mục con.
Chetabahana

6

Tôi đã thấy rằng để tránh chuyển hướng tròn, điều quan trọng là phải giới hạn phạm vi chuyển hướng vào thư mục gốc. Tôi đã sử dụng:

RewriteEngine on
RewriteCond %{REQUEST_URI} ^/$
RewriteRule (.*) http://www.example.com/store [R=301,L]

6

Hầu hết các giải pháp trên đều đúng nhưng tất cả đều thiếu tính minh bạch của chuyển hướng.

Trong trường hợp của tôi, khi truy cập www.example.com, tôi muốn được chuyển hướng đến thư mục con / cửa hàng nhưng không cập nhật URL tới www.example.com/store . (tất cả những gì tôi muốn là lấy mẫu mã trang thư mục đó). Nếu đó là trường hợp của bạn, giải pháp dưới đây hoạt động hoàn hảo.

RewriteEngine on
RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ /store/$1 [L]

nguồn: http://wiki.dreamhost.com/Transparently_redirect_your_root_directory_to_a_subdirectory


Tôi nên thay đổi điều gì nếu tôi cần rằng www.example.com đã được chuyển hướng đến www.othersite.com/store mà không cập nhật URL? Tôi đã thử nhưng không thể điều chỉnh mã của bạn
các bước

Tôi đã cố gắng thay đổi dòng cuối cùng thành RewriteRule ^(.*)$ http://otherpage.com/subfolder/$1 [L]nhưng nó cập nhật URL
các bước

Tất cả bạn cần là để thay thế các từ examplestore.
Mahmoud Zalt

Tôi đã không giải thích khá tốt. Tôi sở hữu example.comotherpage.comtên miền. Khi tôi truy cập, example.comtôi muốn nội dung từ otherpage.com/subfolderđược hiển thị mà không cần cập nhật URL
các bước

Vâng, câu trả lời của tôi ở trên không làm điều đó. Hãy thử đăng một câu hỏi mới.
Mahmoud Zalt


4

Trước đây tôi sử dụng mã sau đây hoạt động chính xác để chuyển hướng URL gốc của từng tên miền / tên miền phụ của tôi sang thư mục con tương ứng của chúng được đặt tên chính xác là tên miền phụ / tên miền như sau:

RewriteCond %{HTTP_HOST} ^sub1.domain1.com
RewriteCond %{REQUEST_URI} !subs/sub1.domain1.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

RewriteCond %{HTTP_HOST} ^sub2.domain1.com
RewriteCond %{REQUEST_URI} !subs/sub1.domain2.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

RewriteCond %{HTTP_HOST} ^sub1.domain2.com
RewriteCond %{REQUEST_URI} !subs/sub1.domain2.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

RewriteCond %{HTTP_HOST} ^sub2.domain2.com
RewriteCond %{REQUEST_URI} !subs/sub2.domain2.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

Tuy nhiên khi tôi muốn thêm một mục con hoặc tên miền khác thì nó sẽ cần phải được thêm vào đoạn mã trên. Sẽ thuận tiện hơn nhiều khi đơn giản hóa nó để hoạt động như ký tự đại diện (*) như dưới đây:

RewriteCond %{HTTP_HOST} ^sub
RewriteCond %{REQUEST_URI} !/subs/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

Vì vậy, bất cứ khi nào tên miền / tên miền khác được thêm vào miễn là tên miền phụ có tiền tố phụ (như: sub3.domain1.com, sub1.domain3.com, v.v.), mã sẽ vẫn hợp lệ.


3

Tôi nghĩ rằng các vấn đề chính với mã bạn đã đăng là:

  • dòng đầu tiên khớp với máy chủ bắt đầu bằng mẫu.com, vì vậy www.sample.com không khớp.

  • dòng thứ hai muốn có ít nhất một ký tự, theo sau là www.sample.com cũng không khớp (tại sao bạn thoát khỏi w đầu tiên?)

  • không có quy tắc nào được bao gồm chuyển hướng đến url bạn đã chỉ định trong mục tiêu của mình (cộng với, mẫu bị sai chính tả là samle, nhưng điều đó không liên quan).

Để tham khảo, đây là mã bạn hiện có:

Options +FollowSymlinks
RewriteEngine on

RewriteCond %{HTTP_HOST} ^sample.com$
RewriteRule (.*) http://www.sample.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^(.+)\www.sample\.com$
RewriteRule ^/(.*)$ /samle/%1/$1 [L]

2

Một chút googling, cho tôi những kết quả này:

RewriteEngine Trên chỉ mục
RewriteBase /
RewriteRule ^. (. *)? $ Http://domain.com/subfolder/ [r = 301]

Điều này sẽ chuyển hướng mọi nỗ lực truy cập một tệp có tên index.s Something đến thư mục con của bạn, cho dù tệp đó có tồn tại hay không.

Hoặc thử điều này:

RewriteCond% {HTTP_HOST}! ^ Www.sample.com $ [NC]
RewriteRule ^ (. *) $% {HTTP_HOST} / samlse / $ 1 [R = 301, L]

Tôi chưa thực hiện nhiều chuyển hướng trong tệp .htaccess, vì vậy tôi không chắc liệu nó có hoạt động không.


2

Hai cách trong số các giải pháp khả thi để đạt được điều này là: 1. Tạo một .htaccesstệp trong thư mục gốc như bên dưới (chỉ cần thay thế example.com và my_dir bằng các giá trị tương ứng của bạn):

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/my_dir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /my_dir/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ my_dir/index.php [L] 
</IfModule>
  1. Sử dụng RedirectMatch để chỉ chuyển hướng URL gốc / URL sang thư mục hoặc URL khác,

    RedirectMatch ^ / $ http://www.example.com/my_dir


1

thử sử dụng các dòng dưới đây trong htaccess

Lưu ý: bạn có thể cần kiểm tra tên của default.html là gì

default.html là tệp tải theo mặc định trong thư mục gốc.

RewriteEngine

Redirect /default.html http://example.com/store/


0

bạn chỉ cần thêm mã này vào tệp .htaccess của bạn

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /folder/index.php [L]
</IfModule>

0

Tôi sẽ trả lời câu hỏi ban đầu không phải bằng cách chỉ ra một cú pháp có thể khác (có rất nhiều câu trả lời khác) nhưng bằng cách chỉ ra một điều mà tôi đã từng phải giải quyết, điều đó khiến tôi mất một thời gian để tìm ra:

What am I doing wrong?

Có khả năng% {HTTP_HOST} không được điền chính xác hoặc hoàn toàn không. Mặc dù, tôi chỉ thấy điều đó xảy ra trong một máy duy nhất trên một máy chủ được chia sẻ, với một số apache vá được tùy chỉnh 2.2, dù sao đó cũng là một khả năng.


0

Điều này sẽ thử subir nếu tập tin không tồn tại trong thư mục gốc. Cần điều này khi tôi chuyển một trang web .html cơ bản dự kiến ​​sẽ được chạy ở cấp gốc và đẩy nó đến một thư mục con. Chỉ hoạt động nếu tất cả các tệp đều phẳng (không có thủ thuật .htaccess trong thư mục con có thể). Hữu ích cho những thứ được liên kết như tập tin css và js.

# Internal Redirect to subdir if file is found there.
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-s
RewriteCond %{DOCUMENT_ROOT}/subdir/%{REQUEST_URI} -s
RewriteRule ^(.*)$ /subdir/$1 [L]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.