.htaccess menulis ulang untuk mengarahkan ulang URL root ke subdirektori

246

Mencoba untuk mendapatkan

www.example.com

untuk langsung ke

www.example.com/store

Saya telah mencoba beberapa bit kode dan tidak ada yang berhasil.

Apa yang saya coba:

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]

Apa yang saya lakukan salah?

Willi Mentzel
sumber

Jawaban:

275

Anda dapat menggunakan aturan penulisan ulang yang menggunakan ^ $ untuk mewakili root dan menulis ulang itu ke direktori / store Anda, seperti ini:

RewriteEngine On
RewriteRule ^$ /store [L]

sumber
6
RewriteRule ^ /? $ /Index.do [R]
barclay
2
^ / $ sepertinya tidak pernah cocok jadi kurasa ^ /? $ tidak perlu.
NateS
Apakah mungkin untuk menampilkan url lengkap dan melanjutkan aturan pemrosesan? Dalam kasus saya, saya menulis ulang beberapa url agar cantik. Ini menjaga url example.com - Saya ingin example.com/store dan kemudian melanjutkan dengan penulisan ulang lainnya.
gin93r
Bekerja dengan baik untuk saya juga.
Jitesh Sojitra
1
Baru-baru ini saya menghabiskan banyak waktu men-debug mengapa ini tidak berfungsi pada situs di Ubuntu Apache 2.4.7. Penulisan ulang debugging menunjukkan aturan dipukul dan menghasilkan PENGIRIMAN INTERNAL. Kemudian sepertinya hanya parkir itu dan mencari halaman indeks. Ternyata jika mod_dir diaktifkan DAN ada kandidat halaman indeks dalam dir maka itu menimpa mod_rewrite, KECUALI Anda mengatur: DirectoryCheckHandler On
Gerrit
142

Saya terkejut bahwa tidak ada yang menyebutkan ini:

RedirectMatch ^/$ /store/

Pada dasarnya, ini mengarahkan kembali root dan hanya URL root. Jawabannya berasal dari tautan ini

Dio Phung
sumber
3
terima kasih, ini bekerja dengan baik untuk saya dengan aturan yang sudah ada. tidak ada konflik.
Ilmuwan
1
Yang ini bekerja dengan sempurna. Juga, itu mencakup http dan https.
Sayem Shafayet
3
Dan ini untuk pengalihan 301:RedirectMatch 301 ^/$ /store/
Andrea
Ya, lebih sederhana dengan menulis ulang. Terima kasih!
Orden
2
@Andrea Dan ini untuk 302 redirect sementara: RedirectMatch 302 ^ / $ / store /
Faizan Anwer Ali Rupani
108

Coba ini:

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

Jika Anda ingin arahan ulang eksternal (yang menyebabkan peramban yang berkunjung menunjukkan URL yang dialihkan), atur Rtanda juga di sana:

RewriteRule ^$ /store [L,R=301]
Gumbo
sumber
4
Itu bekerja dengan indah. Sample.com dan www.sample.com mengalihkan ke www.sample.com/store. Itulah yang saya inginkan. Terima kasih Gumbo, dan semua orang yang menjawab. Saya belajar banyak membaca tanggapan Anda dan menghargai umpan baliknya.
1
Saya ingin tahu, apakah ini akan ditampilkan www.example.comsebagai URI setelah pengalihan? Jika tidak, bagaimana hal itu diubah untuk melakukannya?
stefmikhail
1
♦ - Dan mengapa solusi Anda lebih baik daripada Sander di bawah? Saya perhatikan baris terakhir Anda sama, tetapi jika hanya itu yang dibutuhkan, mengapa termasuk RewriteConddan yang pertama RewriteRule?
stefmikhail
jika kode ini digunakan, dapatkah Anda mengetikkan browser Anda exmple.com/../aboveSubDir?
@GamErix Ini akan diatasi /aboveSubDiroleh browser atau server.
Gumbo
79

Inilah yang saya gunakan untuk mengarahkan ulang ke subdirektori. Ini tidak terlihat dan masih memungkinkan melalui permintaan yang cocok dengan file yang ada atau apa pun.

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]

Ganti situs.com dan tundukkan dengan nilai-nilai Anda.

Jage
sumber
Bekerja seperti yang diharapkan! Bagus!
kachar
halaman beranda 'tersembunyi' ... tapi begitu saya mengklik tautan nama subdirat muncul di bilah alamat ... apakah ada cara untuk mencegah nama subdirit muncul?
dsdsdsdsd
4
hanya melakukan root - tidak melakukan sub direktori
php-b-grader
3
Bagi saya itu memberi "Internal Server Error": /
Pithikos
1
Terima kasih banyak, kamu tidak tahu sudah berapa lama aku mencari ini.
Base Desire
26

Untuk mengatur pengalihan yang tidak terlihat dari root ke subfolder, Anda dapat menggunakan RewriteRule berikut di /root/.htaccess:

RewriteEngine on

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

Aturan di atas secara internal akan mengarahkan browser dari:

untuk

Dan

untuk

sementara browser akan tetap di folder root.

starkeen
sumber
1
Ini harus menjadi jawaban yang diterima ... Aturan RewriteRep sepanjang (seperti yang disarankan dalam beberapa jawaban lain) menyebabkan pengalihan tak terbatas, karena / subfolder dialihkan ke / subfolder / subfolder, dll ... RewriteCond% {REQUEST_URI}! ^ / Subfolder memastikan bahwa jika URL sudah dialihkan, itu tidak dilakukan lagi
patrick
21

Alternatif lain jika Anda ingin menulis ulang URL dan menyembunyikan URL aslinya:

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

Dengan ini, jika Anda misalnya mengetik http://www.example.com/product.php?id=4, itu akan membuka file secara transparan di http://www.example.com/store/product.php?id=4tetapi tanpa menunjukkan kepada pengguna url lengkap.

gaborous
sumber
2
Tambah QSA(tambahkan string kueri) ke [L]( [L, QSA]) jika Anda ingin string kueri terbawa ke url yang ditulis ulang.
devios1
@chaiguy terima kasih atas tipnya, tetapi di server saya itu bekerja tanpa QSA (tapi saya setuju mungkin lebih baik untuk menambahkan QSA). Mungkin karena konfigurasi khusus dari server apache saya?
Gaborous
1
Metode ini bagi saya, example.com menunjukkan konten dari example.com/store secara transparan tetapi example.com/test mengalihkan ke example.com/store/test, menampilkan url
Geoffrey Hale
14

Ini sepertinya solusi paling sederhana:

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

Saya mendapatkan loop pengalihan dengan beberapa solusi lain.

pengguna1801050
sumber
2
yang ini tidak menyembunyikan direktori
php-b-grader
8

Saya tidak mengerti pertanyaan Anda ...

Jika Anda ingin mengalihkan setiap permintaan ke subfolder:

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

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

Jika Anda ingin mengarahkan ulang ke subfolder yang memiliki nama domain

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

http://www.example.com/* -> wwwroot/example.com/*
inf3rno
sumber
Saya suka kode Anda ([^\.]+\.[^\.]+)$untuk memesan domain sebagai nama subfolder.
Chetabahana
6

Saya telah menemukan bahwa untuk menghindari redirection melingkar, penting untuk membatasi ruang lingkup redirection ke direktori root. Saya akan menggunakan:

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

Sebagian besar solusi di atas benar tetapi mereka semua kehilangan transparansi pengalihan.

Dalam kasus saya, ketika mengunjungi www.example.com saya ingin diarahkan ke subdirektori / toko tetapi tanpa memperbarui URL ke www.example.com/store . (yang saya inginkan adalah mendapatkan kode halaman dari direktori itu). Jika demikian, solusi di bawah ini berfungsi dengan baik.

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

sumber: http://wiki.dreamhost.com/Transparently_redirect_your_root_directory_to_a_subdirectory

Mahmoud Zalt
sumber
Apa yang harus saya ubah jika saya perlu agar www.example.com dialihkan ke www.othersite.com/store tanpa memperbarui URL? Saya mencoba tetapi tidak dapat mengadaptasi kode Anda
langkah
Saya mencoba mengubah baris terakhir RewriteRule ^(.*)$ http://otherpage.com/subfolder/$1 [L]tetapi memperbarui URL
langkah
Yang Anda butuhkan hanyalah mengganti kata-kata exampledan store.
Mahmoud Zalt
Saya tidak menjelaskan dengan baik. Saya memiliki example.comdan otherpage.comdomain. Ketika saya mengunjungi, example.comsaya ingin agar kontennya otherpage.com/subfolderditampilkan, tanpa memperbarui URL
langkah
Yah jawaban saya di atas tidak melakukan itu. Coba posting pertanyaan baru.
Mahmoud Zalt
4

Sebelumnya saya menggunakan kode berikut yang berfungsi dengan benar untuk mengarahkan ulang URL root dari masing-masing domain / subdomain saya ke subdirektori korespondensi mereka yang dinamai persis sebagai sub / domain itu sendiri seperti di bawah ini:

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]

Namun ketika saya ingin menambahkan subs atau domain lain maka perlu ditambahkan dalam kode di atas. Seharusnya lebih mudah untuk menyederhanakannya agar berfungsi seperti wildcard (*) seperti di bawah ini:

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

Jadi setiap kali subdomain / domain lain ditambahkan selama nama subdomain memiliki awalan sub (seperti: sub3.domain1.com, sub1.domain3.com dll.) Kode akan tetap valid.

Chetabahana
sumber
3

Saya pikir masalah utama dengan kode yang Anda posting adalah:

  • baris pertama cocok dengan host yang diawali dengan sample.com secara ketat, jadi www.sample.com tidak cocok.

  • baris kedua menginginkan setidaknya satu karakter, diikuti oleh www.sample.com yang juga tidak cocok (mengapa Anda lolos dari w pertama?)

  • tidak ada aturan yang disertakan yang mengarahkan ulang ke url yang Anda tentukan dalam sasaran Anda (plus, sampel salah eja sebagai samle, tapi itu tidak relevan).

Untuk referensi, inilah kode yang saat ini Anda miliki:

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]
Artem Russakovskii
sumber
2

Sedikit googling, beri saya hasil ini:

RewriteEngine Pada
RewriteBase /
RewriteRule ^ index. (. *)? $ Http://domain.com/subfolder/ [r = 301]

Ini akan mengarahkan ulang setiap upaya untuk mengakses file bernama index.something ke subfolder Anda, apakah file tersebut ada atau tidak.

Atau coba ini:

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

Saya belum melakukan banyak pengalihan dalam file .htaccess, jadi saya tidak yakin apakah ini akan berhasil.

Steven
sumber
2

Dua cara keluar dari solusi yang mungkin untuk mencapai ini adalah: 1. Buat .htaccessfile di folder root seperti di bawah (cukup ganti example.com dan my_dir dengan nilai yang sesuai):

<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. Gunakan RedirectMatch untuk hanya mengarahkan ulang URL root “/” ke folder atau URL lain,

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

Mushtaq Hussain
sumber
1

coba gunakan baris berikut di htaccess

Catatan: Anda mungkin perlu memeriksa apa nama default.html

default.html adalah file yang memuat secara default di folder root.

RewriteEngine

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

Abouasy
sumber
0

Anda cukup menambahkan kode ini ke file .htaccess Anda

<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>
ganesan karthikeyan
sumber
0

Saya akan menjawab pertanyaan awal bukan dengan menunjukkan kemungkinan sintaks yang lain (ada banyak di antara jawaban lainnya) tetapi dengan menunjukkan sesuatu yang pernah saya harus tangani, itu membuat saya perlu waktu untuk memikirkan:

What am I doing wrong?

Ada kemungkinan bahwa% {HTTP_HOST} tidak diisi dengan benar, atau tidak sama sekali. Meskipun, saya hanya melihat itu terjadi hanya pada satu mesin di host bersama, dengan beberapa apache 2.2 yang ditambal, kemungkinan masih ada.

Μάκης Παλάσης
sumber
0

Ini akan mencoba subdir jika file tidak ada di root. Membutuhkan ini karena saya memindahkan situs web .html dasar yang diharapkan untuk dijalankan pada tingkat root dan mendorongnya ke subdir. Hanya berfungsi jika semua file datar (tidak ada trik htaccess di subdir mungkin). Berguna untuk hal-hal yang ditautkan seperti file css dan 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]
mikeytown2
sumber