Kök URL'yi alt dizine yeniden yönlendirmek için .htaccess yeniden yazma


246

Almaya çalışıyorum

www.example.com

doğrudan gitmek

www.example.com/store

Kod birden fazla bit denedim ve hiçbiri işe yaramadı.

Ne denedim:

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]

Neyi yanlış yapıyorum?

Yanıtlar:


275

Kökü temsil etmek için ^ $ kullanan bir yeniden yazma kuralı kullanabilir ve bunu / store dizininize aşağıdaki gibi yeniden yazabilirsiniz:

RewriteEngine On
RewriteRule ^$ /store [L]

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

2
^ / $ hiç eşleşmiyor gibi görünüyor bu yüzden ^ /? $ gerekli değildir.
NateS 13.014

Daha sonra tam URL'yi göstermek ve kuralları işlemeye devam etmek mümkün mü? Benim durumumda, bazı URL'leri güzel olacak şekilde yeniden yazıyorum. Bu url example.com tutar - example.com/store istiyorum ve sonra diğer yeniden yazma ile devam ediyorum.
gin93r

Benim için de iyi çalışıyor.
Jitesh Sojitra

1
Son zamanlarda bunun neden Ubuntu Apache 2.4.7'deki bir sitede çalışmadığını hata ayıklamak için çok zaman harcadım. Yeniden yazma hata ayıklaması kuralın vurulduğunu ve DAHİLİ BİR YÖNLENDİRME oluşturduğunu gösterdi. Sonra sadece park ve bir dizin sayfası aramak gibi görünüyordu. Mod_dir etkinleştirilirse ve dir'de bir dizin sayfası adayı varsa, ayarladığınız UNLESS mod_rewrite'ı geçersiz kıldığını gösterir: DirectoryCheckHandler On
Gerrit

142

Kimsenin bundan bahsetmediğine şaşırdım:

RedirectMatch ^/$ /store/

Temel olarak, kök ve yalnızca kök URL'yi yönlendirir. Cevap bu bağlantıdan kaynaklandı


3
teşekkürler, bu zaten var olan bir kural ile benim için harika çalıştı. çatışma yok.
bilim adamı

1
Bu mükemmel çalışıyor. Ayrıca, hem http hem de https'yi kapsar.
Sayem Shafayet

3
Ve bu 301 yönlendirmesi için:RedirectMatch 301 ^/$ /store/
Andrea

Evet, yeniden yazma ile daha basit. Teşekkürler!
Tarikat

2
@Andrea Ve bu 302 geçici yönlendirme için: RedirectMatch 302 ^ / $ / store /
Faizan Anwer Ali Rupani

108

Bunu dene:

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

Harici bir yönlendirme istiyorsanız (ziyaret eden tarayıcının yönlendirilen URL'yi göstermesine neden olur), Rbayrağı da orada ayarlayın :

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

4
Güzel çalıştı. Sample.com ve www.sample.com adreslerinin ikisi de www.sample.com/store adresine yönlendirir. Sadece istediğim buydu. Teşekkürler Gumbo ve cevaplayan herkese. Yanıtlarınızı okurken çok şey öğrendim ve geri bildirimi takdir ediyorum.

1
Merak ediyorum, bu www.example.comyönlendirme sonrasında URI olarak gösterilecek mi? Değilse, bunu nasıl değiştirirsiniz?
stefmikhail

1
♦ - Peki çözümünüz neden aşağıda Sander'dan daha iyi olsun? Son hattınızın aynı olduğunu fark ettim, ancak gerekli olan her şey varsa neden RewriteCondilkini dahil etmelisiniz RewriteRule?
stefmikhail

bu kod kullanılmışsa, tarayıcınıza exmple.com/../aboveSubDir yazabilir misiniz?

@GamErix Bu /aboveSubDir, tarayıcı veya sunucu tarafından çözülür .
Gumbo

79

Bir alt dizine yönlendirmek için kullandığım şey şu. Bu, görünmez bir şekilde yaptı ve mevcut bir dosyayla veya başka bir şeyle eşleşen isteklere izin veriyor.

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]

Site.com ve alt dizini değerlerinizle değiştirin.


Beklendiği gibi çalışıyor! Harika!
kachar

ana sayfa 'gizli' idi ... ancak bir bağlantıyı tıklattığımda adres çubuğunda alt dizin adı görünüyor ... alt dizin adının görünmesini önlemenin bir yolu var mı?
dsdsdsdsd

4
sadece root yapar - alt dizinler yapmaz
php-b-grader

3
Benim için "Dahili Sunucu Hatası" veriyor: /
Pithikos

1
Çok teşekkür ederim, tam olarak ne kadar zamandır aradığımı bilmiyorsun.
Base Desire

26

Kökten alt klasöre görünmez bir yönlendirme ayarlamak için, /root/.htaccess içinde aşağıdaki RewriteRule komutunu kullanabilirsiniz:

RewriteEngine on

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

Yukarıdaki kural tarayıcıyı dahili olarak şu konumlardan yönlendirir:

için

Ve

için

tarayıcı kök klasörde kalacaktır.


1
Bu kabul edilen cevap olmalıdır ... Birlikte (diğer bazı cevaplarda önerildiği gibi) RewriteRule sonsuz bir yönlendirmeye neden olur, çünkü / subfolder / subfolder / subfolder, vb. İçine yönlendirilir ... RewriteCond% {REQUEST_URI}! ^ / Subfolder bir URL zaten yönlendirilmişse, bir daha yapılmadığından emin olur
patrick

21

URL'yi yeniden yazmak ve orijinal URL'yi gizlemek istiyorsanız başka bir alternatif:

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

Bununla, örneğin http://www.example.com/product.php?id=4yazdığınızda, dosyayı şeffaf bir şekilde açacak, http://www.example.com/store/product.php?id=4ancak kullanıcıya tam URL'yi göstermeyecektir.


2
Ekle QSAiçin (sorgu dizesi append) [L]( [L, QSA]isterseniz sorgu dizeleri yeniden yazılması url-taşınır).
devios1

@chaiguy teşekkürler bahşiş için, ama sunucumda QSA olmadan çalıştı (ama muhtemelen QSA eklemenin daha iyi olduğunu kabul ediyorum). Belki de apache sunucumun özel yapılandırması yüzünden?
gaborous

1
Benim için bu yöntem example.com, şeffaf olarak example.com/store
Geoffrey Hale

14

Bu en basit çözüm gibi görünüyordu:

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

Bazı diğer çözümlerle yönlendirme döngüleri alıyordum.


2
Bu dizini gizlemiyor
php-b-grader

8

Sorunu anlamıyorum ...

Her isteği bir alt klasöre yeniden yönlendirmek istiyorsanız:

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

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

Etki alanı adına sahip bir alt klasöre yönlendirmek istiyorsanız

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

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

Kodunuzun ([^\.]+\.[^\.]+)$etki alanını alt klasör adı olarak ayırmasını seviyorum .
Chetabahana

6

Dairesel yönlendirmeyi önlemek için, kök dizine yönlendirme kapsamını sınırlamanın önemli olduğunu buldum. Kullanırdım:

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

6

Yukarıdaki çözümlerin çoğu doğrudur, ancak hepsinde yönlendirme şeffaflığı yoktur.

Benim durumumda, www.example.com'u ziyaret ederken URL'yi www.example.com/store olarak güncellemeden alt dizine / mağazaya yönlendirilmek istedim . (tüm istediğim bu dizinden sayfa kodu almaktır). Durum buysa, aşağıdaki çözüm mükemmel çalışır.

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

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


URL'yi güncellemeden www.example.com adresinin www.othersite.com/store adresine yönlendirilmesi gerekiyorsa ne değiştirmeliyim? Denedim ama kodunuzu adapte edemedi
adımlar

Son satırı değiştirmeye çalıştım RewriteRule ^(.*)$ http://otherpage.com/subfolder/$1 [L]ama URL'yi güncelliyor
adımları

Tek ihtiyacınız kelimeleri değiştirmektir exampleve store.
Mahmoud Zalt

Çok iyi açıklamamıştım. Ben kendi example.comve otherpage.comalanları. Ziyaret example.comettiğimde otherpage.com/subfolder, URL'yi güncellemeden içeriğin görüntülenmesini istiyorum
adımlar

Yukarıdaki cevabım bunu yapmıyor. Yeni bir soru göndermeyi deneyin.
Mahmoud Zalt


4

Önceden, her bir etki alanımın / alt etki alanımın kök URL'sini tam olarak aşağıdaki gibi kendi alt / etki alanı olarak adlandırılan yazışma alt dizinlerine yönlendirmek için doğru çalışan aşağıdaki kodu kullanıyorum:

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]

Ancak başka bir subs veya etki alanları eklemek istediğinizde yukarıdaki kodda eklenmesi gerekir. Aşağıdaki gibi joker karakter (*) gibi çalışmasını basitleştirmek çok daha uygun olmalıdır :

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

Bu nedenle, alt alan adı alt önekine sahip olduğu sürece başka bir alt alan / alan eklendiğinde (örneğin: sub3.domain1.com, sub1.domain3.com vb.) Kod geçerli kalacaktır.


3

Gönderdiğiniz kod ile ana sorunları olduğunu düşünüyorum:

  • ilk satır kesinlikle sample.com ile başlayan bir ana bilgisayarda eşleşir, bu nedenle www.sample.com eşleşmez.

  • ikinci satır en az bir karakter, ardından da eşleşmeyen www.sample.com ister (neden ilk w'den kaçtınız?)

  • dahil edilen kuralların hiçbiri hedefinizde belirttiğiniz URL'ye yönlendirmiyor (ayrıca örnek tek kelimeyle yanlış yazılmış, ancak bu alakasız).

Referans olarak, şu anda sahip olduğunuz kod:

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

Biraz googling, bana şu sonuçları verir:


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

Bu, index.something adlı bir dosyaya erişmek için, varsa olsun veya olmasın, alt klasörünüze yönlendirmeye çalışacaktır.

Veya şunu deneyin:

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

.Htaccess dosyasında çok fazla yönlendirme yapmadım, bu yüzden çalışacağından emin değilim.


2

Bunu başarmak için olası çözümlerin iki yolu vardır: 1. .htaccessKök klasörde aşağıdaki gibi bir dosya oluşturun (sadece example.com ve my_dir öğelerini karşılık gelen değerlerinizle değiştirin):

<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. "/" Kök URL'sini yalnızca başka bir klasöre veya URL'ye yönlendirmek için RedirectMatch kullanın,

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


1

htaccess'te aşağıdaki satırları kullanmaya çalışın

Not: default.html adının ne olduğunu kontrol etmeniz gerekebilir.

default.html, kök klasörde varsayılan olarak yüklenen dosyadır.

RewriteEngine

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


0

bu kodu .htaccess dosyanıza eklemeniz yeterlidir

<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

Orijinal soruyu başka bir olası sözdizimine işaret ederek değil (diğer cevapların arasında çok fazla var) değil, bir zamanlar uğraşmak zorunda olduğum bir şeye işaret ederek cevap vereceğim, bu beni anlamaya biraz zaman aldı:

What am I doing wrong?

% {HTTP_HOST} işlevinin düzgün şekilde doldurulmaması veya hiç doldurulmaması olasılığı vardır. Her ne kadar, paylaşılan bir ana bilgisayarda yalnızca bir makinede gerçekleştiğini gördüm, ancak bazı özel yamalı apache 2.2 ile, yine de bir olasılık.


0

Dosya kökte yoksa bu alt dizini deneyecektir. Ben kök düzeyinde çalıştırılmak ve bir alt dizine itti bekliyor temel bir .html web sitesi taşındı olarak bu gerekli. Yalnızca tüm dosyalar düzse çalışır (alt dizinde .htaccess hilesi mümkün değildir). Css ve js dosyaları gibi bağlantılı şeyler için kullanışlıdır.

# 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]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.