2016-09-10 8 views
1

は、ここに私の問題です: mod_rewriteをパスを指定せずにサブディレクトリに正しくリダイレ​​クトする方法は?

はの私は、 www.example.comをウェブサイトを持っているとしましょう。私は、そのドメインのドキュメントルートのサブディレクトリにあるアプリケーション subdirを持っている:

/home/example/public_html/subdir/

subdirこの.htaccessが含まれています

# Redirect trailing slash if not a directory 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)/$ /subdir/$1 [L,R=301] 

それは動作します。 http://www.example.com/subdir/not_a_directory/に行くと(明らかにnot_a_directoryはディレクトリではない)、私はhttp://www.example.com/subdir/not_a_directoryにリダイレクトされます。これは私が望むものです。

ただし、書き換えルールまたは.htaccessのどこにでもsubdirを指定する必要はありません。アプリケーションのパスを変更せずに何かを変更できるようにしたい。それは、(書き換えルールの相対パスは、絶対パスまたはに対し、ファイルシステムのパスを返すなぜ起こるか、私は一種の理解http://www.example.com/home/example/public_html/subdir/not_a_directory

:私は

# Redirect trailing slash if not a directory 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)/$ $1 [L,R=301] 

...次のことを試してみました。しかし、私はにリダイレクトルート絶対パスはURLを返します)、私が探しているものを達成する方法を理解することはできません。

RewriteRuleにキャプチャグループを持つ方法はありませんか?パスの一部はsubdirですか?私もRewriteBase /を設定しようとしましたが、何も変わらないようです。

書き換えルールが混乱するので、どんな助けでも大歓迎です。ありがとうございました!

答えて

1

ために、この場所をお試しください:

RewriteEngine On 

# Remove trailing slash if not a directory 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} ^(/.+)/$ 
RewriteRule /$ %1 [L,R=301,NE] 

RewriteCond %{REQUEST_URI}からのパスをキャプチャ、私たちは完全なURIパスをキャプチャすることができます。

+1

はい、ありがとう!私は 'REQUEST_URI'に' subdir'が含まれていることに気付きましたが、私はRewriteCond内でキャプチャグループを使うことはできませんでした(あるいは、私ができることを忘れてしまった)。もう2つの質問:1.私は、 'RewriteRule/$'を 'RewriteRule ^'で置き換えることができると思います.2番目のRewriteCondは既にスラッシュで終わるURLのみを書き直します。 2.なぜNE(noescape)フラグ? – benface

+1

はい 'RewriteRule ^'はここで完璧ですが、 'NE'はURLのいくつかの特殊文字がエンコードされるのを避けるためです。 – anubhava

+0

「NE」が欲しくない場合はありますか? – benface

0

あなたがどこかの.htaccessでsubdirを指定せずにこのルールを使用することができますでRewriteBase

RewriteBase subdir/ 
+1

OP書いた: '書き換えルールや.htaccessのどこかにsubdirを指定したくない。 – anubhava

関連する問題