私はこのルールを持っています:
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
GETフォームを送信してもうまくいきません。たとえばhttp://192.168.1.100/site/admin/analytics/chart?view=daily
、http://192.168.1.100/site/admin/analytics/chart/view/daily
2番目のルールは何ですか?
あなたがここで話していることは、何か違うものです。必要なコードの一部しかありません。
あなたはすでに持っているルールで正しいです -
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
このルールは、着信リクエストを「キャプチャ」し、ドメイン名の後のすべてをパラメータindex.php
として に渡します。これは、正規表現でキャプチャしたものです。括弧内のすべてがキャプチャされます。だから今のところ大丈夫...$_GET
?url=$1
$1
^(.+)$
パズルの次のピースはindex.php
、元の URL を GET パラメーターとして受け取った内部で行うことです。ユーザーに返すページを知るには、そのパラメーターを解析する必要があります。
たとえば、このようなものを見てみましょう -
http://yourdomain.com/user/123
あなたが内部で行うindex.php
ことは、次のようなものです -
$originalURL = $_GET['url'];
$URLParts = explode('/',$originalURL);
今、あなたは中にいます$URLParts
Array (
'user',
'123'
)
ここから、データをユーザーに正確に出力する方法を決定しますが、明確にするために大まかな例を示します-
// Get base module - array_pop() also removes it from the array
$baseModule = array_pop($URLParts);
$requestData = $URLParts; // Collect all other data that was passed
switch($baseModule){
case "user":
// If we know the request is for a user page, we know the next URL part
// will be the user id. Use it to fetch user information from our database.
$userID = $requestData[0]
$user = getUserByID($userID);
echo $user['name'] . "<br/>";
echo "<img src='". $user['picture'] ."' width='300' >";
break;
case "picture":
echo "<img src='http://i.imgur.com/s5cH9.png' width='300' >";
break;
case "video":
echo "<a href='http://youtu.be/Xk_XaJ7gE4Q' target='_blank' >Video Link</a>";
break;
default:
echo "404 - The page you requested was not found.";
break;
}
exit();
このコードを配置すると、システムはリクエストが来たときに何をすべきかを正確に知ることができます -
http://yourdomain.com/user/123
http://yourdomain.com/picture
http://yourdomain.com/video
迷惑な URL を指定しても、要求したページが見つからないという保守的なメッセージが表示されます。
ここで注意すべきことの 1 つは、受信データを使用するときは常に注意する必要があるということです。システムのセキュリティ ホールを見つけようとする悪意のあるスクリプトからリクエストが送信されている可能性があります。すべての着信データ (たとえば 内のすべて$_GET
) を潜在的な脅威として扱う必要があります。手元にあるデータを確実に把握する必要があります。
これの実用的な例は、SQL クエリで送信された user_id を使用することです。ID でユーザーを検索していることはわかっているため、取得するデータは数値でなければなりません。呼び出すことでそれを検証できます.intval()
-これにより、SQLに数値があることが保証されます。これらのことを防ぐための (おそらくより良い) テクニックは他にもたくさんありますが、それは別のトピックであり、これはすでに長い投稿の最後にあるメモにすぎません。:)