-1

私は、php Webサイトを作成するときに、index.php?id = 2のようなものを使用でき、index.phpは$_GET['id']でIDをフェッチできることを知っています。Webサイトの1つにAPIを作成したいのですが、さまざまな例があります。

ツイッター:

https://api.twitter.com/1.1/statuses/mentions_timeline.json?count=2&since_id=14927799

それで、$ _ GET ['count']などを理解するファイル言及_timeline.jsonを使用して、FTPサーバー上にフォルダー「1.1」とフォルダー「statuses」を作成します。

他のAPIは次のようになります。

https://quote.fm/api/recommendation/delete

そして、私は次の方法で推奨事項を削除できます:

https://quote.fm/api/recommendation/delete/?id=1 or
https://quote.fm/api/recommendation/delete/1

通常、Webサイトでは、このようなURL構造を作成して、mod_rewriteを使用して機能させることができます。ここで理解しているように、セクションごとに異なるURLを作成します。

https://xyz.com/api/user/get/1
https://xyz.com/api/user/delete/1

だから私はサブフォルダーを削除してFTPサーバーに乗るフォルダーユーザーを作成します。それぞれにindex.phpファイルがありますか?スクリプトは、/1がid= 1であることをどのように認識しますか?

誰かが私を理解していますか?スクリプトがURL構造を、アプリからの必要なデータに変換する方法を理解するのが困難です。

ありがとう!

4

1 に答える 1

3

この章を、ルーター実装のreadmeからここにコピーします。

URLとは何か、ルーティングの設定方法

URLは、いくつかの部分で構成される単純な文字列です。

http://example.com/foo?bar=baz
  |         |       |    |
  |         |       |    +- query
  |         |       +- path
  |         +- host
  +- scheme

URLには、認証情報、ポート、フラグメントが追加で含まれている場合がありますが、ここでは単純に保つようにします。Kunststube\Routerはパスのみを扱います。スキームとクエリは通常、ルーティングに影響を与えず、ホストは通常​​、Webサーバーによって処理されます。

Apache Webサーバーを使用した一般的なセットアップを想定すると、Apacheは通常「ルーティング」を行います。次のようなHTTPリクエストを受信します。

GET /foo/bar/baz?some=parameters HTTP/1.1

これで、Webサーバーは、選択した方法でこの要求に自由に応答できるようになります。ほとんどのWebサーバーがデフォルトで行うことは、URLのパスをハードディスク上のファイルにマップすることです。Webサーバーは、最初に適切なDocumentRootが何であるか、つまり「パブリックWebフォルダー」として構成されたディスク上のフォルダーを把握します。DocumentRootがであると仮定しましょう/var/www。次に、リクエストパスをそのルートに連結し、結果として/var/www/foo/bar/baz。次に、そのファイルがディスク上に存在するかどうかを判断し、応答として提供しようとします。要求されたファイルがで終わる場合、.phpまたはApacheがファイルをPHPファイルとして扱うように構成されている場合、出力を返す前に、まずPHPインタープリターを介してファイルを実行します。

PHPルーターを使用して独自のカスタムルーティングを使用するには、Apacheがファイルを検索してディスク上で提供するプロセスをインターセプトする必要があります。これは、Apache構成ファイルで実行できます。しかし、これらのファイルにアクセスできる場合は、自分が何をしているかを知っていると思います。そこでは、最適なセットアップの具体的な詳細については説明しません。代わりに、コアApache構成ファイルを編集できない、または編集したくない、またはファイルに頼る典型的なケースについて説明し.htaccessます。Apacheがディスク上のディレクトリ構造をトラバースして、提供する正しいファイルを見つけると、呼び出されたファイル.htaccessがその中に配置されているかどうかを各ディレクトリでチェックします。見つかった場合は、実行するか、その中で定義されているルールをファイル検索プロセスに組み込みます。

達成したいのは、Apacheがすべてのリクエストに対して1つの特定のPHPファイルを「検索」して実行し、元のURLをそのPHPファイルで使用できるようにして、独自のルーティングを実行できるようにすることです。これを行う最も簡単で汚い方法は簡単RewriteRuleです:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^(.*)$ index.php?url=/$1 [QSA,L] 
</IfModule>

これをファイルに入れると仮定しましょう/var/www/.htaccess。Apacheがそのディレクトリでファイル検索を開始すると、これらの書き換えルールが解析されます。この時点でApacheが探しているパスの「内部状態」はですfoo/bar/baz。の正規表現^(.*)$RewriteRuleそのパスに一致し(式は基本的に「何にでも一致する」と言います)、ルールはパスをに書き換えます index.php?url=/foo/bar/baz。次に、オリジナルsome=parametersがそのパス/ URLに再度追加されます(QSAフラグのため)。その後、Apacheは書き直されたパスを探し続けますindex.php。したがって、コードを挿入するだけ/var/www/index.phpで、Apacheはそのコード用のPHPインタープリターを起動します。PHPにはURLクエリ部分が渡されます 。これは、PHPでは次のように?url=/foo/bar/baz&some=parametersアクセスできます。 $_GET['url']$_GET['some']。したがって、完全なセットアップは次のようになります。

基本設定

ファイル/フォルダの構造
/var
    /www
        .htaccess
        index.php
        /Kunststube
            /Router
                Router.php
                ...
.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^(.*)$ index.php?url=/$1 [QSA,L] 
</IfModule>
index.php
<?php

require_once 'Kunststube/Router/Router.php';

$r = new Kunststube\Router\Router;
$r->add('/foo');
...
$r->route($_GET['url']);

そして、それがすべてです。すべてのリクエストを同じPHPファイルにリダイレクトし、元のURLをクエリパラメータとして追加する基本的な書き換えルール。これは、ルーティングプロセスを呼び出すために使用されます。

警告と微調整

上記の設定の重要な注意点の1つはurl、元のクエリパラメータが書き換えられたURLに追加されるため、URLにというクエリパラメータを含めることができないことです。URL /foo/bar?url=bazは次のように書き換えられます。

index.php?url=/foo/bar&url=baz

2番目のurlパラメーターが最初のパラメーターに置き換わります。アプリケーションでクエリパラメータを使用する必要がある場合はurl、書き換えルールに別のパラメータ名を選択してください。

次に、Kunststube \ Routerは、渡されるURLが 。route()で始まることを想定していることに注意してください/。上記のように、またはPHPで、書き換えプロセス中にそのスラッシュを追加できます。そこにあることを確認してください。

第三に、通常、CSSや画像ファイルなど、PHPを介してルーティングしたくないファイルもあります。それらをApacheから直接提供する必要があります。このための適切な設定は次のとおりです。

/var
    /Kunststube
        /Router
            ...
    /MyApp
        MyScript.php
        ...
    /www
        .htaccess
        index.php
        /css
            style.css
            ...
        /img
            kitten.jpg
            ...

パブリックWebルートディレクトリからすべての実際のPHPファイルを取り出し、パブリックアセットファイルと最小限のindex.phpファイルのみをそこに残します。RewriteRuleを次のように調整します。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=/$1 [QSA,L] 
</IfModule>

は、要求されたファイルが物理的に存在しない場合にのみ適用されるRewriteCondことを確認します( )。つまり、ファイルは実際に存在し、Apacheはそれを直接提供できるため、URLのリクエストはそのまま通過します。物理的に存在しない「架​​空の」ファイルに対するリクエストはすべて送信 され、そこにルーティングできます。内部では、ルーターへの正しいパスを使用していることを確認してください。RewriteRule!-fcss/style.cssindex.phpindex.php

require_once '../Kunststube/Router/Router.php';

実際、ルートを他の場所に完全に定義し、オートローダーを使用して必要なファイルをロードすることをお勧めしますが、これはこのドキュメントの範囲外です。

于 2013-03-27T09:29:01.300 に答える