2011-10-14 16 views
9

pretty URLの基本的なURLリダイレクトを達成しようとしています。イメージ、CSSなども同じパスに存在するため、URLがスラッシュを付けずにアクセスすると自動的に追加されます。相対URLへのmod_rewriteリダイレクトを行う方法

私はこのような絶対URLを入れた場合、これは正常に動作します:

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ http://www.mydomain.com/myParentDir/$1/ [R,nc,L] 

しかし、私はそれを私はフォルダで物事を移動するたびに変更する必要がないように、私は、相対URLに変更する場合これは単に機能しません。

これらは私が試したどのようなものであり、全てが動作し、または/ public_htmlの/ ...のようなサーバーの実際の内部ディレクトリパスに私をリダイレクトしません:行うには正しい方法です

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ ./myParentDir/$1/ [R,nc,L] 

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ myParentDir/$1/ [R,nc,L] 

何URLのリダイレクトユーザーが何か入力した場合ように:

http://www.mydomain.com/somedir/myVirtualParentDir/myVirtualSubdir 

を彼は(HTTP 301または302を介して)にリダイレクトされます:

http://www.mydomain.com/somedir/myVirtualParentDir/myVirtualSubdir/ 

ありがとうございます。

EDIT:明らかではないため、詳細を追加してください。 私はギャラリーを実装しているといい、mod_rewriteを使ってかなりのURLを使いたいとします。 だから、私は次のようなURLがしたい:猫のサムネイルを示し

http://www.mydomain.com/somedir/galleries/cats 

を、しばらく:ペルシャという名前のすべての猫のサムネイルから一つの画像を示し

http://www.mydomain.com/somedir/galleries/cats/persian 

。 だから、実際には物理的なディレクトリ構造と次のようになり書き換え:

http://www.domain.com/somedir/gallery.php?category=cats&image=persian 

をだから私は/ギャラリーに作られたとに応じて、すべての要求をキャッチしている/ somedirで.htaccessファイルを入れて何をしたいのかそれを次の仮想サブディレクトリが、2書き換えルールで、書き換えのプレースホルダとしてそれらを使用する:

RewriteRule ^galleries/(A-Z0-9_-]+)/$ ./gallery.php?category=$1 [nc] 
RewriteRule ^galleries/(A-Z0-9_-]+)/+([A-Z0-9_-]+)$ ./gallery.php?category=$1&image=$2 [nc] 

さて問題は、実際にはギャラリースクリプトがhttp://www.domain.com/somedir/csshttp://www.domain.com/somedir/jsに位置いくつかのCSS、Javascriptとイメージを、必要とすることで、それぞれhttp://www.domain.com/somedir/imagesである。

絶対URLをハードコードしたくないので、CSS、JS、およびイメージは相対URL(./css、./js、./imagesなど)を使用して参照されます。

RewriteRule ^galleries/[A-Z0-9_-]+/css/(.*)$ ./css/$1 [nc] 

問題はhttp://www.domain.com/somedir/galleries/cats仮想ディレクトリであるため、ユーザーがあれば、上記にのみ動作することです::

http://www.domain.com/somedir/gallaries/cats/ 

ユーザーが最後のスラッシュを省略した場合は、次のようにだから私は、URLの書き換えを行うことができmod_dirは実際にはこのディレクトリが実際には存在しないため、追加しません。

私はそれが動作する絶対URLにリダイレクトリライトを置く場合:

RewriteRule ^galleries/([A-Z0-9_-]+)$ http://www.mydomain.com/subdir/galleries/$1/ [R,nc,L] 

をしかし、私は、私が好きなドメインでこれを置くことができるようにしたいので、私はハードコードされたURL接頭辞を持っている必要はありません私が好きなサブディレクトリに、私はこの試みた:

RewriteRule ^galleries/([A-Z0-9_-]+)$ galleries/$1/ [R,nc,L] 

をしかし、その代わりに、それはにリダイレクト:

http://www.mydomain.com/home/myaccount/public_html/subdir/galleries/theRest 

明らかに私が望むものではありません。

EDIT:さらに明確化

私が探しています解決策は、.htaccessファイル内のドメイン名またはフォルダパスをハードコーディングを避けるためです。私は、スクリプトとリソースの残りの部分で.htaccessをパッケージ化すると、ユーザーが自分のWebサーバーでそれを解凍した場所であれば、それはそのままで動作するソリューションを探しています。この後のスラッシュの問題とは別に、すべてのことがそうです。

親ディレクトリやウェブサーバのパスを.htaccessでハードコーディングする方法は、私が探しているものではありません。

+0

@DoktorJ私の投稿の編集はあなたの質問に答えますか? –

+0

あなたの受け入れられた答えを選択してください。 – sjas

答えて

0

私はあなたの問題を完全に理解していません。

mod_dirモジュールのためにほとんどのApacheインストールでスラッシュリダイレクトが自動的に行われます(mod_dirモジュールを持っている可能性は99%です)。

あなたは追加する必要があります。

DirectorySlash On 

をしかし、それはデフォルト値です。

So. foo/barにアクセスし、barがfooディレクトリのファイルではなくサブディレクトリである場合、mod_dirはfoo/bar/へのリダイレクトを実行します。

私が知っている唯一の事は、ディレクトリ内のbar.php、bar.php、bar.a-mime-extension-knwon-by-apacheを終了しようとしているOption Multiviewsです。したがって、次のように追加してください:

Option -Multiviews 

すべてのrewriteRulesを削除してください。このデフォルトのApacheの動作が得られない場合は、mod-rewriteを見なければならないかもしれませんが、核爆弾を使ってクモを殺すようなものです。核兵器はよく使うためにはかなり厄介なことがあります。

EDIT:あなたは、これは動作するはず述べ、このdocumentation howtoを確認することができMOD-書き換えると最後のスラッシュの問題については

RewriteEngine on 
RewriteBase /myParentDir/ 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.+[^/])$   $1/ [R] 
+0

ご返信ありがとうございます。ただし、これらは実際のディレクトリではありません。これらは物理的に存在せず、きれいなURLの仮想ディレクトリです。実際には、URL:http://www.mydomain.com/somedir/myVirtualParentDirは存在しません。それがなければ、イメージなどへの相対リンクが無効になります。 – jbx

+0

なぜRewriteBaseをインクルードしましたか?それは私が避けたいと思う全体のポイントです。 .htaccess内のパスをハードコードしたくありません。私はそれを置くサブdirで動作するものが欲しいです。これは、リダイレクトで完全なパスをhttp://www.mydomain.com/myParentDir/として指定するのと同じですが、これは私が望まないものです。残りの部分は私の元の問題とまったく同じです。ここで、$ 1 /は実際の物理URLにリダイレクトしています。あなたが提案しているのは、/ myVirtualDir/theRestの代わりに物理myParentDir/theRestにリダイレクトするだけです。 – jbx

+0

@jbx:リンクを読んでください。これはトップレベルのディレクトリに置かれ、すべての子サブディレクトリで動作する必要があります。 – regilero

4

は、ここでストレートApache Documentation(下の「末尾のスラッシュ問題」からソリューションです):

0123:

RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.+[^/])$   $1/ [R] 

は、ここでそれを追加し、最後のスラッシュのためREQUEST_URIをテストa solutionです

RewriteCond %{REQUEST_URI} !(/$|\.) 
RewriteRule (.+) http://www.example.com/$1/ [R=301,L] 

は、ここでは、特定のREQUEST_URIパターンを免除することを可能にすることanother solutionです:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !example.php 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ http://domain.com/$1/ [L,R=301] 

は、これらの助けを願っています。 :)

1

このかもしれない仕事:あなたはすべてでこれを必要と考える理由

RewriteRule ^myParentDir/[A-Z0-9_-]+$ %{REQUEST_URI}/ [NS,L,R=301] 

はしかし、私はわかりません。

RewriteRule ^galleries/([A-Za-z0-9_-]+/)*(css|js|images)/(.*)$ ./$2/$3 

を、すべてが関係なく、ブラウザが/somedir/galleries/css/whatever.cssまたは/somedir/galleries/cats/css/whatever.cssあるいは/somedir/galleries/cats/persian/calico/css/whatever.cssを要求するかどうかのうまく動作するはずです:ちょうどあなたのCSS/JS /画像ファイルの書き換えルールは次のようになります。

ps。このルールの1つの問題は、「css」、「js」または「images」のギャラリー名を使用できないことです。これらの仮想ディレクトリに「.css」、「.js」、「.images」などの名前を付けるか、有効なギャラリー名と競合しない他の名前付けスキームを使用して修正することができます。

2

このルールでは、実際のファイル/ディレクトリではないURLに後続のスラッシュを追加する必要があります(Apacheは通常、既存のディレクトリに対して自動的にリダイレクトを実行するため、必要としています)。

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+[^/])$ $1/ [L,R=301] 

編集:

ドキュメントルートへの相対パスを追加からApacheのを防止するために、あなたはRewriteBaseを使わなければなりません。たとえば、アプリケーションのルートとなるフォルダに、物理パスを上書きする次の行を追加します。

RewriteBase/
+0

RewriteBaseの使い方は、*と*の後ろにスラッシュを付けることです。たとえば、 "/ foo"または "foo /"の代わりに "/ foo /"と入力します。 RewriteBaseはまだまだ私にとってはちょっと面倒だったが、最終的にはうまくいった。ありがとう! –

関連する問題