可能ですが、RewriteMapを使用して、 内で使用できるマッピングを定義する必要がありますRewriteRule
。
Apache バージョン 2.2 はデータベースに直接アクセスできないため、実際のクエリを実行して結果を返すスクリプトを作成する必要があります。このマップは、「外部書き換えプログラム」を使用して定義できます。
したがって、stdin から「cats」を取得し、データベースにクエリを実行して「1」を返すスクリプトがある場合は、次のように定義します。
RewriteMap item_lookup prg:/path/to/item_lookup.php
そのディレクティブはサーバーまたは vhost 構成にある必要があり、htaccess ファイルにあることはできません。ただし、htaccess ファイルでマッピングを使用できます。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]
したがって、これは URI/cats
を受け取り、それを に書き換え/item.php?id=1
ます。
Apache 2.4 を使用している場合は、「DBD」マップを利用できます。外部スクリプトを使用しなくても、マップ定義に直接クエリを挿入できます。同じように使用します。
RewriteMap item_lookup "fastdbd:SELECT id FROM items WHERE name = %s"
次に、同じ方法で使用します。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]
DBD/FastDBD クエリを使用せずに、item.php
とにかく 2 番目の外部スクリプトですべての作業を複製することになるため、. 次のようなものを追加するだけです:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^item/([0-9]+)$ /item.php?id=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([A-Za-z0-9-]+)$ /item.php?name=$1 [L]
item.php
スクリプトで、idとnameの両方を確認します。nameがある場合は、データベース ルックアップを実行して ID に変換します。管理がはるかに簡単で、サーバー/仮想ホスト構成にアクセスする必要がなく、書き換えマップを使用することで問題が複雑になることもありません。