ルートURLをサブディレクトリにリダイレクトするための.htaccess rewrite


246

取得しようとしています

www.example.com

直接行く

www.example.com/store

複数のコードを試してみましたが、どれも機能しません。

私が試したこと:

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]

何が悪いのですか?

回答:


275

次のように、^ $を使用してルートを表し、/ storeディレクトリにそれを書き換える書き換えルールを使用できます。

RewriteEngine On
RewriteRule ^$ /store [L]

6
RewriteRule ^ /?$ /index.do [R]
バークレー

2
^ / $は一致しないようですので、^ /?$は必要ないと思います。
NateS 2014年

次に完全なURLを表示してルールの処理を続行することは可能ですか?私の場合、私はいくつかのURLを書き直してきれいにしています。これにより、example.comというURLが保持されます。example.com/ storeが必要になり、他の書き換えを続行します。
gin93r 2014年

私もうまくいきます。
Jitesh Sojitra 2016年

1
つい最近、Ubuntu Apache 2.4.7のサイトでこれが機能しない理由をデバッグするのに長い時間を費やしました。書き換えデバッグは、ルールにヒットし、内部リダイレクトを生成することを示しました。次に、それを駐車してインデックスページを探しているように見えました。mod_dirが有効で、dirにインデックスページ候補がある場合は、設定しない限り、mod_rewriteをオーバーライドします。DirectoryCheckHandlerOn
Gerrit

142

誰もこれに言及しなかったことに驚きました:

RedirectMatch ^/$ /store/

基本的には、ルートとルートURLのみをリダイレクトします。このリンクからの回答


3
おかげで、これは既存のルールで私にとってはうまくいきました。衝突はありません。
科学者2014年

1
これは完璧に動作します。また、httpとhttpsの両方をカバーしています。
Sayem Shafayet

3
そしてこれは301リダイレクトの場合:RedirectMatch 301 ^/$ /store/
Andrea

はい、書き直しの方が簡単です。ありがとう!
Orden

2
@Andreaそして、302一時的なリダイレクトの場合:RedirectMatch 302 ^ / $ / store /
Faizan Anwer Ali Rupani

108

これを試して:

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

外部リダイレクトが必要な場合(訪問先ブラウザーにリダイレクトされたURLを表示させる)、Rそこにもフラグを設定します。

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

4
それは美しく機能しました。sample.comとwww.sample.comの両方がwww.sample.com/storeにリダイレクトされます。それがまさに私が欲しかったものです。ガンボ、そして答えてくれた皆さんありがとう。私はあなたの回答を読んで多くのことを学び、フィードバックに感謝します。

1
気になるのですがwww.example.com、リダイレクト後にURIとして表示されますか?そうでない場合、どのように変更するのですか?
stefmikhail

1
♦-そして、なぜあなたの解決策はサンダーの以下のものよりも優れているのですか?あなたの最後の行は同じであることに気づきましたが、それだけで十分な場合は、なぜRewriteCond最初の行と最初の行を含めるのRewriteRuleですか?
stefmikhail

このコードを使用する場合、ブラウザにexmple.com/../aboveSubDirと入力できますか?

@GamErixこれは/aboveSubDir、ブラウザまたはサーバーによって解決されます。
ガンボ

79

これは、サブディレクトリにリダイレクトするために使用したものです。これは目に見えない形で行われ、既存のファイルなどに一致するリクエストを許可します。

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とsubdirを自分の値で変更します。


期待どおりに動作します!すごい!
kachar 2013年

ホームページは「ステルス」でした...しかし、リンクをクリックすると、サブバー名がアドレスバーに表示されます...サブディレクトリ名が表示されないようにする方法はありますか?
dsdsdsdsd 2013年

4
ルートのみを実行します-サブディレクトリを実行しません
php-b-grader

3
私にとっては「内部サーバーエラー」が発生します:/
Pithikos

1
どうもありがとうございました。私がこれを正確に探していた時間がどれくらいかわかりません。
Base Desire

26

ルートからサブフォルダーへの非表示のリダイレクトを設定するには、/root/.htaccessで次のRewriteRuleを使用できます。

RewriteEngine on

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

上記のルールは、内部的にブラウザをリダイレクトします:

そして

ブラウザーはルートフォルダーに残ります。


1
これは受け入れられる答えでなければなりません... RewriteRuleは(他のいくつかの答えで提案されているように)/ subfolderが/ subfolder / subfolderなどにリダイレクトされるため、無限のリダイレクトを引き起こします... RewriteCond%{REQUEST_URI}!^ / subfolder URLが既にリダイレクトされている場合は、再度実行されないようにします
patrick

21

URLを書き換えて元のURLを非表示にする場合の別の方法:

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

これにより、たとえばと入力http://www.example.com/product.php?id=4すると、透過的にファイルhttp://www.example.com/store/product.php?id=4が開かれますが、ユーザーに完全なURL は表示されません。


2
追加QSAに(クエリ文字列APPEND)を[L][L, QSA]したい場合は、クエリ文字列が書き換えられたURLに-持ち越さ)。
devios1 2013年

@chaiguyはヒントに感謝しますが、私のサーバーではQSAなしで動作しました(しかし、QSAを追加した方が良いと思います)。多分それは私のapacheサーバーのいくつかの特別な設定のためですか?
激烈な2014年

1
この方法では、example.comはexample.com/storeのコンテンツを透過的に表示しますが、example.com / testはexample.com/store/testにリダイレクトし、URLを示します
Geoffrey Hale

14

これは最も簡単な解決策のようでした:

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

他のいくつかのソリューションでリダイレクトループが発生しました。


2
これはディレクトリを隠しません
php-b-grader

8

質問が理解できません...

すべてのリクエストをサブフォルダーにリダイレクトする場合:

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

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

ドメイン名を持つサブフォルダーにリダイレクトする場合

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

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

([^\.]+\.[^\.]+)$ドメインをサブフォルダー名として予約するコードが好きです。
チェタバハナ2016

6

循環リダイレクトを回避するには、リダイレクトの範囲をルートディレクトリに制限することが重要であることがわかりました。私は使用したでしょう:

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

6

上記の解決策のほとんどは正しいですが、それらはすべてリダイレクトの透過性を欠いています。

私の場合、www.example.comにアクセスしたときに、URLをwww.example.com/storeに更新せずに、サブディレクトリ/ storeにリダイレクトしたいと考えました。(私が欲しいのはそのディレクトリからページコードを取得することだけです)。その場合は、以下の解決策が完全に機能します。

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

ソース:http : //wiki.dreamhost.com/Transparently_redirect_your_root_directory_to_a_subdirectory


URLを更新せずにwww.example.comをwww.othersite.com/storeにリダイレクトする必要がある場合、何を変更すればよいですか?私は試しましたが、コードを適合させることができませんでした
ステップ

最後の行を次のように変更しようとしましたRewriteRule ^(.*)$ http://otherpage.com/subfolder/$1 [L]が、URLが更新されます
手順

必要なのは、単語exampleとを置き換えることだけですstore
Mahmoud Zalt 2015

私はあまりよく説明しませんでした。私はドメインを所有example.comしていotherpage.comます。にアクセスしたときに、URLを更新せずにexample.comコンテンツをotherpage.com/subfolder表示したい
手順

さて、上記の私の答えはそれをしません。新しい質問を投稿してみてください。
Mahmoud Zalt


4

以前は正しく機能している次のコードを使用して、ドメイン/サブドメインのそれぞれのルートURLを、対応するサブディレクトリにリダイレクトします。

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]

ただし、別のサブまたはドメインを追加する場合は、上記のコードに追加する必要があります。以下のように、ワイルドカード(*)のように機能するように単純化すると、はるかに便利になります。

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

そのため、サブドメイン名にサブのプレフィックスが付いている限り(sub3.domain1.com、sub1.domain3.comなど)、別のサブドメイン/ドメインが追加されても、コードは有効なままです。


3

あなたが投稿したコードの主な問題は次のとおりです。

  • 最初の行は厳密にsample.comで始まるホストで一致するため、www.sample.comは一致しません。

  • 2行目には少なくとも1文字が必要で、その後に一致しないwww.sample.comが続きます(なぜ最初のwをエスケープしたのですか?)

  • 含まれているルールはいずれも、目標で指定したURLにリダイレクトしません(さらに、サンプルはサンプルとしてスペルミスがありますが、それは無関係です)。

参考までに、現在あるコードは次のとおりです。

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

少しググると、次の結果が得られます。

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

これにより、ファイルが存在するかどうかに関係なく、index.somethingという名前のファイルへのアクセス試行がサブフォルダーにリダイレクトされます。

またはこれを試してください:

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

.htaccessファイルでリダイレクトをあまり行っていないので、これが機能するかどうかはわかりません。


2

これを実現するための考えられる解決策の2つの方法は次のとおりです。1. .htaccess以下のようにルートフォルダーにファイルを作成します(example.comとmy_dirを対応する値に置き換えます):

<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. RedirectMatchを使用して、ルートURL「/」のみを別のフォルダーまたはURLにリダイレクトします。

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


1

htaccessで以下の行を使用してみてください

注:default.htmlの名前を確認する必要がある場合があります

default.htmlは、デフォルトでルートフォルダにロードされるファイルです。

RewriteEngine

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


0

このコードを.htaccessファイルに追加するだけです

<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

元の質問に答えるには、考えられる別の構文を指摘する(他にも多くの答えがある)のではなく、以前に対処する必要があったことを指摘することで、理解に時間がかかりました。

What am I doing wrong?

%{HTTP_HOST}が適切に設定されていないか、まったく設定されていない可能性があります。共有ホストの1台のマシンでのみ発生することを確認しましたが、カスタムパッチを適用したApache 2.2を使用していますが、それでも可能性があります。


0

ルートにファイルが存在しない場合、これはサブディレクトリを試します。ルートレベルで実行されることが予想される基本的な.html Webサイトを移動してサブディレクトリにプッシュしたため、これが必要でした。すべてのファイルがフラットな場合にのみ機能します(サブディレクトリでの.htaccessトリックは不可)。cssや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]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.