2009-07-08 1 views
1

ご理解とご協力をいただきありがとうございます。私はすべての私の改訂からかなり長くなっているので、私は完全に質問を再起しています。
のindex.php
インデックスajax.php
管理/ index.phpを
管理/インデックスajax.phpURLリライトヘルプ

:ルートから

: Iは4つのエントリポイントとPHP MVCフレームワークを持っています

リクエストを受け取り、URLに基​​づいて対応するファイルに書き直す.htcaccessファイルが必要でした。長いURLはindex.php?rt = cms/view/15となり、index/cms/view/15としたいと思っていました。その部分は1つのつかまりを除いてかなり多く行われます。

が今ここに私の.htaccessファイルである:私は2つのフォルダに簡単なサイトを作っている

# htaccess file for framework - GOOD 
Options +FollowSymLinks 

# Turn on the mod_rewrite engine - GOOD 
RewriteEngine On 

# Hide indexes - GOOD 
Options -Indexes 

# If a file is not one of these, continue processing. - GOOD 
RewriteRule \.(css|js|jpg|jpeg|png|gif|ico)$ - [L] 

# RewriteRules for folder index files 
#RewriteRule ^(index)?(.php)?$ index.php [L] - GOOD 
#RewriteRule ^admin(/?)(index)?(.php)?$ admin/index.php [L] - GOOD 

# RewriteRules for admin folder arguements - going from more specific to less 
RewriteRule ^admin/ajax/[A-Za-z0-9-_/]*$ admin/index-ajax.php?rt=$1 [L] 
RewriteRule ^admin/[A-Za-z0-9-_/]*$ admin/index.php?rt=$1 [L] 

# RewriteRule for root ajax file 
RewriteRule ^ajax/[A-Za-z0-9-_/]*$ index-ajax.php?rt=$1 [L] 

# RewriteRule for root file - by here, it is not ajax or admin related, so only 
# possible option left if the root index file 
RewriteRule ^[A-Za-z0-9-_/]*$ index.php?rt=$1 [L] 

- 「ルート」と「ルート/管理者」、およびそれらのそれぞれの内部CSS、画像、いくつかのダミーのコンテンツを含むjavascriptフォルダ。 'root'と 'root/admin'の中にはindex.phpとindex-ajax.phpファイルがあり、url引数が何であれ単純に出力し、各フォルダのcss、js、およびimageファイルを使用します。

私が今問題にしているのは、index/blahまたは/ admin/index/blahのようなURLを作成すると、ページが正しく表示され、引数が正しいことです。しかし、私がindex/blah/viewやadmin/index/blah/viewのようなurlを実行すると、引数は正しい(?rt = blah/view)が、CSSの/ js// blah/[css]の代わりにindex/[css]を入力します。

これをどう対処するかについてのアイデアはありますか?私はcss/js/imageファイルが.htaccessを経由して行くようにしましたので、そこでの作業は少なくなります。

答えて

0

あなたがHTMLに相対URLを使用しているので、画像/ CSSの/ etcが壊れ、そして今あなたが行っていることは、より多くの彼らのネストされた:あなたは、書き換え処理を終了する前にルールにしたいです壊れている?私が遭遇したいくつかの他のMVC設定では、通常、リクエストURLに基​​づいてコントローラによって設定され、ビューコンポーネントが画像/スタイル/スクリプトのようなアセットにすべてのパスを接頭辞として使用する、ある種の「ルートパス」変数があります。

あなたの.htaccessの問題はコントローラ/ PHPの問題になります。それが許容できる解決策であれば、コントローラはリクエストURLを「/」で爆発させたり、その結果から相対URLを構築します。

私が行ったカスタムMVCセットアップでも同様のことをしました。 http://avogadro.ws/hosted/skel/public/results/school-1をチェックし、CSSの場所の先頭のソースを確認してください。そのページのCSSは実際にはhttp://avogadro.ws/hosted/skel/レベルにあり、コントローラーはこれを相対文字列にします。

+0

はい。 html内のimage/css/js/etcファイルのリンクは、その文書に関連しています。 MVCのすべての結果(グローバルスタイルシート、htmlスケルトンイメージなど)にはいくつかの外部リソースがあります。 私の.htaccessでは、css、js、またはimage拡張子を持つファイル要求はそのまま受け取りました。これらのリソースは処理が必要ないと考えられているため、そのまま使用されています。しかし、今度は、URLが入れ子になっているので、 "blah"が実際にコントローラであるときに、それらが "blah"と呼ばれるフォルダにあると思うので、URLは存在しないフォルダに移動します。 –

+0

あなたのimage/css/js/etcファイルが.htaccessをバイパスしていることをお勧めします。上記の私の解決策は、 "URLにプレフィックスを付け加えることで、問題が"曖昧な "フォルダにあると思っています。上記の例では、 '/ hosted/skel'フォルダが実際に存在しています。しかし、 'public/results /'はそうではありません。 'school-1'ページがCSSファイルを "main.css"として参照した場合、 '/ hosted/skel/public/results/main.css'を取得しようとします。だから、CSSファイルを "../../main.css"と呼ぶようにHTMLを変更します。これは '/ hosted/skel/main.css'に置かれます。これはファイルの実際の場所です。 – MidnightLightning

2

まあ、中に入れた$を除いて、それはちょっと壊れてしまいます。 $は正規表現の終わりを示すので、正しく動作するとは思わない。

また、スラッシュをエスケープする必要があるかもしれませんが、わかりません。

+0

私はちょうど十分速く入力しないでください。 – seth

+0

私は$記号が左のURLから正しいURLに値を転送するプレースホルダとして役立つと思った? –

+0

彼は/ – seth

0

最後の行はおそらく次のようになります。

RewriteRule ^/([A-Za-z\-_]+)/([A-Za-z\-_]+)/([A-Za-z0-9\-_]+)$ /index.php?com=$1&action=$2&val=$3 [L,R] 
9

あなたはすべてがindex.phpので扱われるべきであることを確認しますか? images/cssなどの静的ファイルはどうでしょうか?

あなたに興味のある代替方法がここにあります。ファイルやディレクトリとして存在しないURLをindex.phpファイルに転送し、そのURLを解析することができます。 [domain.com]/cms/view/15は[domain.com] /index.php/cms/view/15に書き換えられます。この作業では、Apacheの指示子AcceptPathInfoをOnに設定する必要があります。 .htaccessの

RewriteEngine On 
#check url is not a valid file 
RewriteCond %{REQUEST_FILENAME} !-f 
#check url is not a valid directory 
RewriteCond %{REQUEST_FILENAME} !-d 
#rewite anything left 
RewriteRule ^(.*)$ index.php/$1 [L] 

のindex.php

$path = trim($_SERVER['PATH_INFO'], '/'); 
$pathParts = explode('/', $path); 

if (isset($pathParts[0])) { 
    $com = $pathParts[0]; 
} else { 
    $com = 'defaultcom'; 
} 

//$com[1] will be 'view' if supplied 
//$com[2] will be 15 if supplied 

私はあなたが定義し、Apacheの設定でURLを理解することを余儀なくされていないため、このアプローチを気に入っていますPHPでほとんどの作業を行うことができます。

編集

あなたは代わりに、これは拡張子のないあなたのPHPスクリプトに、リスト内のすべての要求をリダイレクトしますあなたの.htaccessファイルとしてこれを使用することができます。 RewriteCondは、管理フォルダへの要求が書き換えられないようにする必要があります。

RewriteEngine On 
#don't rewrite admin 
RewriteCond %{REQUEST_URI} ^admin/ 
#rewrite anything with a file extension not in the list 
RewriteRule !\.(js|gif|jpg|png|css|ico)$ /index.php [L] 
+0

画像とCSSはPHPでも扱うことができます。私は定期的にApacheを再構成することで、かなり愚かで確かに実行可能です(ただし、これは可能かもしれません)。static_filesから提供されるファイルに有効期限ヘッダを追加するだけの 'static.php'ファイルを置いています/ ' –

+0

ありがとう、私はイメージ、CSSなどについて考えたことはありません。ユーザーは最終HTML出力のためにそれらのファイルに直接アクセスする必要があります - 正しい? しかし、私はユーザーがPHPファイルにアクセスすることを望んでいません - 彼らはindex.php以外のものを実行する必要はありません - 他のすべてのPHPファイルはフレームワークによって使用され、とにかく文脈を使い果たした場合は動作します。 –

+0

もう一度ありがとうございます。リストにないものを書き換える場合は、次の書き換えルールに進むことができますか?したがって、ファイルがリストにない場合は、次の書き換えルールに進み、index.php urlを書き換えます。 –

3

私はそれをlike Tom Haigh saidを行うと、PHPと要求されたURLパス解析します:

// extract the URL path 
$_SERVER['REQUEST_URI_PATH'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); 
// extract the path segments 
$segments = explode('/', trim($_SERVER['REQUEST_URI_PATH'], '/')); 
// expected parameters and its default values 
$params = array(
    'com' => 'default', 
    'action' => 'default', 
    'val' => 'default' 
); 
foreach ($params as $key => $val) { 
    if (isset($segments[0])) { 
     $_GET[rawurldecode($key)] = rawurldecode(array_shift($segments)); 
    } else { 
     break; 
    } 
} 
$restOfTheURLPath = implode('/', $segments); 
var_dump($_GET); 

そしてmod_rewriteのルール:に答えて

# redirect every request, that cannot be mapped to an existing file, to index.php 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^admin(/|$) admin/index.php [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule^index.php [L] 

編集をごコメントと今編集した質問:ディレクトリを除外することができますだから、

RewriteRule ^(css|images)/ - [L] 
RewriteRule ^admin/index\.php$ - [L] 
RewriteRule !^index\.php$ index.php [L] 
+0

ありがとう、私はイメージ、CSSなどについて考えたことはありません。ユーザーは最終HTML出力のためにそれらのファイルに直接アクセスする必要があります - 正しい?
しかし、ユーザーが他のPHPファイルにアクセスできないようにするために、index.phpを除くすべてのPHPファイルを実行する必要はありません。他のすべてのPHPファイルはフレームワークで使用され、とにかく文脈を使い果たしてしまえば働きません。
私はMVCフレームワークを開発しているので、index.phpはURLからのユーザーリクエストを処理するエントリポイントとして機能します。それとも、私の思考過程で何かが欠けている(それは可能です:)。 –

+0

ありがとう、私はあなたのようにデュアルアプローチをすることに決めました。 GET変数には、パスの異なるコンポーネントを分離するスラッシュがすでに含まれているパスが含まれます。私はmod_rewriteを使ってパブリックURLの "?rt ="を取り除き、PHPを使ってGET変数をパースします。これは、mod_rewriteですべての処理をやってみるよりも簡単に行うべきです。私のフレームワークは既にGET変数を分割することを扱っているので、これはmod_rewriteの最も早い適応です。 .htaccessファイルが正しいことを確認するだけです。 –

+0

素晴らしいアルゴリズム! PHPのexplodeが空の配列を期待通りに返さないときは、空のREQUEST_URIを処理するために$ segments = array_filter(explode(...))を実行するだけでした。 –

3

私はあなたの質問のポイントを逃していない限り(私はあなたの質問の編集後にピッチングしている)、多くのフォルダの深いURLの相対的な画像/ CSSパスを修正する必要があるかのように聞こえます。簡単な解決策、相対的な画像パスを使用しないでください!ただ、スラッシュを使用して画像/ CSSのリンクを開始。..

<img src="/img/logo.png" alt="something" /> 

は、私はいつもあなたが多くのページ予測不可能なフォルダの深さに電力を供給する単一のテンプレートを持っている場合、それはより簡単なアプローチだことがわかりました。ローカル開発用のテストURLを持っている限り、ローカルサーバーとプロダクションサーバーで正常に動作します。

+0

このアプローチは、私が過去に持っていたリライトパスの問題でうまくいくことがわかりました。 – justinl

1
# htaccess file for framework - GOOD 
Options +FollowSymLinks 

# Turn on the mod_rewrite engine - GOOD 
RewriteEngine On 

# Hide indexes - GOOD 
Options -Indexes 

# If a file is not one of these, continue processing. - GOOD 
RewriteRule ^images/([A-Za-z0-9\-_]*)\.(css|js|jpg|jpeg|png|gif|ico))$ - 
RewriteRule ^images/admin/([A-Za-z0-9\-_]*)\.(css|js|jpg|jpeg|png|gif|ico))$ - 
RewriteRule ^admin/(([A-Za-z0-9\-_/]*)/([A-Za-z0-9\-_]*)\.(css|js|jpg|jpeg|png|gif|ico))$ admin/images/$3.$4 [L] 
RewriteRule ^(([A-Za-z0-9\-_/]*)/([A-Za-z0-9\-_]*)\.(css|js|jpg|jpeg|png|gif|ico))$ images/$3.$4 [L] 

# RewriteRules for folder index files 
#RewriteRule ^(index)?(.php)?$ index.php [L] - GOOD 
#RewriteRule ^admin(/?)(index)?(.php)?$ admin/index.php [L] - GOOD 

# RewriteRules for admin folder arguements - going from more specific to less 
RewriteRule ^admin/ajax/([A-Za-z0-9\-_/]*)$ admin/index-ajax.php?rt=$1 [L] 
RewriteRule ^admin/([A-Za-z0-9\-_/]*)$ admin/index.php?rt=$1 [L] 

# RewriteRule for root ajax file 
RewriteRule ^ajax/([A-Za-z0-9\-_/]*)$ index-ajax.php?rt=$1 [L] 

# RewriteRule for root file - by here, it is not ajax or admin related, so only 
# possible option left if the root index file 
RewriteRule ^([A-Za-z0-9\-_/]*)$ index.php?rt=$1 [L] 

のLinux/Apacheサーバ上のディレクトリとファイルのセットアップを

をテストするときに上記の.htaccessは私が/アヤックスに画像を要求するリライトであなたは無視し、画像の行を置き換え作品/ hello/world/images/imagesに移動し、管理フォルダにある場合は/ admin/imagesに移動します。