2012-02-12 6 views
2

一連のウェブサイトサブドメインの計画を立てて自分自身をコーナーに描いたようです。私の計画が救助されるのか、私が本当に自分自身を足で撃ったのか、何トンもの物を完全に書き直す必要があるのだろうか?ここに問題があります:サブドメインのもつれ(ノットスミスが必要)

テーマのバリエーションを扱う一連のサブドメインサイトを計画しました。説明のために、www.colour.comというサイトを持っているとしましょう(これはファイルがpublic_htmlにある 'hub'です)。次に、サブドメインred.colour.com(public_html/red)、green.colour.com public_html/green)とblue.colour.com(public_html/blue)で表示されます。この時点までにすべての良いことを確認します。

これらのサイトはすべて共通のスタイルシート、Javascripts、イメージなどで多くのリソースを共有しています。これらは私が複製したくないリソースですが、スペースの無駄ですが、異なるバージョンのファイルを開発する危険性があり、それらのすべてが互いに歩調を合わせているわけではありません。だから、私は元気だと思ったことをしたし、これらをすべて「ハブ」(public_html/css、public_html/jsなど)に保存します。

私のサイトがほぼライブになったときに発見したことは、たとえばpublic_html/redをred.colour.comとして使用すると、1つ上の階層(../)にあるサポートファイルが表示されなくなり、Appearenceと機能が完全な画面の混乱に陥りました。

大規模な書き直しが短く、この混乱から誰もが考えることができる方法はありますか?

ありがとうございます!

フランク。

+0

フランク、私たちはもっと情報が必要です。あなたのサブドメインをどのように実装していますか?別の仮想ホスト、または '%{HTTP_HOST}'のデコードによって?あなたが求めるものは簡単に実行可能ですが、どちらに依存しています。また、共有ホスティングプランを使用している場合は、 'phpinfo()'を実行し、プロバイダが** DOCUMENT_ROOT **と同じ値の環境変数またはサーバ変数を設定しているかどうかをお知らせください。そして、私は解決策を投稿することができます。ありがとう – TerryE

+0

こんにちはテリー。ごめんなさい、あなたのコメントを見ました。あなたは私に何時間もの労力とストレスをかけたかもしれません!私は問題を解決して、ちょうど私自身の答えをここに掲載しました。それは十分に簡潔なようですが、あなたがそれに弱点を見出し、より良い解決策を持っていれば、それを聞きたいです!あなたの質問に答えようとするのは難しいです。私はcpanelを使ってサブドメインを設定しました。それがどのように実装されているのか分かりません - 私は自分の深みから外れています。あなたが尋ねた2番目の質問:PHPRC、_SERVER ["DOCUMENT_ROOT"]、_SERVER ["PHPRC"]、_ENV ["DOCUMENT_ROOT"]はすべてDOCUMENT_ROOTと同じ値です。希望が助けてくれる!フランク – Frankie

+0

フランク、私はあなたが共有サービス上にいることに注意しているので、htaccessタグを追加しました。また、あなたの受信箱をチェックしてください。いくつかのコメントをあなたに投稿すると、そこにリンクされています:) – TerryE

答えて

1

私はそれをクラックしました! それは1ピントの血、2ガロンの汗、3つの涙の涙が必要でしたが、ついにそれを分解しました。 秘密は、私が疑わしいようにmod.rewriteを使用することです。あなたは確かにルート上の領域に対処することはできませんが、そのような場所に参照のうえ、他の方法があり、特にあなたはここに書き換え条件を使用して「は存在しません」ファイルやディレクトリを参照することができます。

RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteCond %{SCRIPT_FILENAME} !-f 

ので、たとえば、currectコンテキストよりも高いレベルにあったスタイルシートディレクトリを参照する場合は、../cssを参照しますが、現在のコンテキストを独自のサブドメインにした後は、 ./cssは存在しません。つまり、上記の書き換え条件のいずれかまたは両方と一致させることができます。私の例では、クライアントを元のドメインwww.colour.com/css経由で(たとえば)cssディレクトリにポイントすることができます。ここでは、完全性のために、他の貧しい魂がこれを克服するのを助けるために(私は正規表現を学ばなければならなかった、mod.rewriteとLordは6時間でこれを解決する他に何を知っている!私!)

DirectoryIndex index.php 
Options +FollowSymLinks 
RewriteEngine On 
RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteRule ^(.*)$ http://www.colours.com/$1 [R=301,L] 

それは、隠しファイルを書き換えることがなどのループを防止するためではない作ることが、私はmod.rewriteについて十分に学習していないなどの追加価値はいくつかの他のディレクティブまだこのsqueekyがきれいにするがあるかもしれません。しかしそれはそのままで、それは私の主な目標の99.99999%です。

1週間以内に編集してください。

私はこの解決法に住んでいましたが、この小さな魔法の代価を支払う代価があることを認めなければなりません。私はあなたが集めるように専門家ではありませんが、このソリューションはブラウザーがそれぞれのリソースを2回要求するように導きます。あなたのサイトが小さく、効率が目立たない場合には問題はないかもしれませんが、最適な読み込み時間を得るためには、このソリューションを使用して、より直接的なもの。ちょうどあなたが知っているので!

+0

私はこの作品が印象づけます。本当に変わったことは、リクエストを 'http://foo.com /../ css /'に 'http:// bar.com/css /'に翻訳することです。 '../'が暗黙的に削除されていることに注目してください。この機能が文書化されているかどうか知っていますか? –

+0

@cooling、そうではありません。これは**共有**サービスなので、** www **は** DOCROOT **、** red **は** DOCROOT/red **などにマップされ、 'http://red.colours.com/css/style.css'を 'http:// www.colours.com/css/style.css'に変更すると、** REQUEST_FILENAME **の' red/'が削除されます。 – TerryE

+0

@TerryE OPの最初のコメントを私の答えに*(私はそれを読むことができるように削除していません)*彼は 'red.colour.com /'にスタイルシートを参照してファイルを持っています。 。/ css/foo.css'。彼のソリューションは、このファイルのリクエストを魔法のように '../'を削除する 'www.colour.com/css/foo.css'へのリダイレクトに変更します。私はこれをtelnetでテストしました。自分でテストして結果を投稿してください。 –

-2

フランク、私たちにXYZを "私は解決策を投稿できます"とは、 "私のウェブホスティング会社を含むすべてのソースはこれを行うことができないと言っています"と一貫していません。

このような301リダイレクトは問題をクライアントのブラウザに戻し、他のサブドメインからリソースを再フェッチするように指示するので、あなたのアプローチはソートを行うだけです。クライアントでの読み込み時間を減らします。

あなたの最初のソリューションは、あなただけの直接あなたのSRCとあなたのHTML内のhref属性http://common.colour.com/...をコーディングすることにより行っている可能性があることです。しかし、これにはスクリプトを変更する必要があるという欠点があります。多くの大量サイトでは、このような静的リソースに別のドメインを使用しており、現在ではしばしばCDNを使用しています。また、ブラウザーはコンテンツをロードするためにドメインごとに2つのストリームを開きますが、別々のストリームへの要求を並行して開くため、パフォーマンス上の利点もあります。

2番目の解決策は、サーバーのファイルシステム内でこれを行うことです。あなたがする必要があるのは、DOCROOT/red/cssのシンボリックリンクをDOCROOT/cssなどに作成することです。PHPでスクリプトを作成している場合は、DOCROOTで一時的な設定スクリプトを作成して実行し、 (これは、共有リソースへのすべてのポイントは別のディレクトリにコピーとしてではなく、実際には、あなたのFTPのブラウザに表示され、あなたが使用することを必要とする重要な機能は、このようなsymlink()です。

<?php 
$root=dirname(__FILE__); 
foreach(array('red', 'green', 'blue') as $c){ 
    foreach(array('css', 'js') as $d) { 
    symlink("$root/$c", "$root/$d/$c); 
    } 
} 

あなたは色やリソースディレクトリを微調整する必要があるだろう私はちょうどこれをタイプして、それをデバッグしなかったことに注意してください;-)余分な;-)

第3の解決策は、.htaccessファイルを使用することですが、内部リダイレクト外部のものよりむしろ。ここでApache rewriteモジュールは要求を別のパス/ファイルに直接マップします。私はあなたのcPanelはHTTP_HOSTred.colour.comに「GET /css/sheet.cssが」DOCROOT/red/css/sheet.cssとして処理されますように、あなたはDOCROOT/XXXなどにXXX.colour.comをマッピングすることを可能にすることを前提としています。ここでは、ルールターゲット文字列に/大手をしたいあなたは

RewriteEngine On 
RewriteBase /

RewriteRule (red|green|blue)/(css|js|images)/(.*) /$2/$3 [L] 

:あなたはあなたのようなルールを使用することができ、前者ならば、これはあなたがDOCROOTまたは個別red/.htaccessなどで単一.htaccessを使用するかどうかによって異なりアプローチ方法。

これらを試してみてください。これは役に立ちます:-)

+0

@ couling:あなたは何のために爆破していますか? (a)「再コーディングしない」と議論した、または「再コーディングしていない」唯一の人物があなたです。 (b)私の2番目の選択肢は、いくつかのシンボリックリンクを追加することです。 1回限りの設定スクリプトでこれを行う方法を示しています*** ***は***アプリケーションを記録していません。 (c)私の3番目の選択肢は、あなたの場合のように 'vconf'ファイルではなく' .htaccess'ファイルに行を追加することです。もう一度***記録しない***。少なくともOPはこれを行うことができます。あなたが答えをdownvoteしようとしているなら、合理的な理由でそれをしてください。 – TerryE

+0

申し訳ありませんが、その反応はやや強すぎました。 OPはレコーディングについては何も言及していませんでしたが、私はそれがあなたの答えの議論に現れたことに同意します。しかし、3つのオプションのうち2つがアプリの記録を伴わない場合、私はあなたの発言の根拠をまだ理解しています。 – TerryE

+0

リクエストに「/../」を埋め込んだ状態を再表示しますが、私は '/ ..を使用することを提案していないので、これはポスターを助けるための手段です。 /それはなぜ私のオプションに関連しているのですか?私は実際にその熊トラップを避けた。あなたの提案されたアプローチを変更しているわけではありません。私自身の3つの選択肢。 – TerryE

関連する問題