可能ですが、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を確認します および名前 。 名前がある場合 、それをIDに変換するために、データベースルックアップを実行します。管理がはるかに簡単で、サーバー/仮想ホストの構成アクセス権を持っている必要はなく、リライトマップを使用して問題を複雑にすることもありません。