私はURLhttp://localhost/index.php?user=1
を持っています。この.htaccess
ファイルを追加すると
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^user/(.*)$ ./index.php?user=$1
http://localhost/user/1
リンクの使用が許可されます。しかし、http://localhost/index.php?user=1&action=update
はどうすればhttp://localhost/user/1/update
にすることができますか?
また、このURLをhttp://localhost/user/add
にするにはどうすればよいですか?ありがとう。申し訳ありませんが、私は.htaccess
に比較的慣れていません。
@denoiseと@mogosselinのアイデアをありがとう。また、私のコード例の欠点のいくつかを指摘してくれた@stslavikもあります。
これが私がそれをする方法です:
_Options +FollowSymLinks
RewriteEngine On
RewriteRule ^user/([0-9]*)/([a-z]*)$ ./index.php?user=$1&action=$2
RewriteRule ^user/([a-z]*)$ ./index.php?user&action=$1
_
リンクでvar_dump($_GET);
を使用して_localhost/user/1234/update
_
_array (size=2)
'user' => string '1234' (length=4)
'action' => string 'update' (length=3)
_
_localhost/user/add
_
_array (size=2)
'user' => string '' (length=4)
'action' => string 'update' (length=3)
_
それが私の目標です。私はPHPを使って内部で他のことだけをします。
あなたはこのようなものを書くことができます:
RewriteEngine On
RewriteRule ^([^/]*)/([^/]*)$ /index.php?user=$1&action=$2 [L]
向きを変えたいなら
http://www.yourwebsite.com/index.php?user=1&action=update
に
http://www.yourwebsite.com/user/1/update
あなたが使うことができます
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^user/([0-9]*)/([a-z]*)$ ./index.php?user=$1&action=$2
PHPでパラメータを表示するには:
<?php
echo "user id:" . $_GET['user'];
echo "<br>action:" . $_GET['action'];
?>
これは、私の意見では、(。*)よりも少しクリーンで安全です。これは基本的にほとんどすべてが受け入れられることを意味します。
これにPHPのタグを付けたので、私が行ったことから少し視点を追加します。それが役立つ場合と役に立たない場合があります。
もちろん、順序に注意して、.htaccessだけで書くこともできます。たとえば、次のようなものがあるとします。
RewriteRule ^user/([0-9]+)/update$ ./index.php?user=$1&action=update
RewriteRule ^user/([0-9]+)$ ./index.php?user=$1
それからそれは、受け取ると
http://localhost/user/1/update
に行く
http://localhost/index.php?user=$1&action=update
ではなく
http://localhost/index.php?user=$1
さて、代わりに私がしたことは、すべてをindex.php?q=$1
にプッシュすることでした
RewriteRule ^(.*)$ index.php?q=$1
次に、index.phpを使用して、クエリがどのように分割されたかを処理しました。だから誰かが入ったとしましょう
http://www.example.com/user/18239810/update
これはに行きます
http://www.example.com/index.php?q=user/18239810/update
そこから、最初の/
に沿ってクエリ文字列を展開し、user
と18239810/update
を指定します。
これは、18239810/update
をuser
コントローラーに渡す必要があることを示しています。そのコントローラーで、引数を再びユーザーIDとコマンドに分解し、コマンドをオンにしてページの読み込み方法を指示し、ユーザーIDを引数としてupdate
関数に渡すことができます。
非常に迅速で汚い例(index.php):
<?php
$getString = explode('/', $_GET['q'], 1);
$controller = $getString[0].'Controller';
require_once('/controllers/'.$controller.'.php');
$loadedController = new $controller( $getString[1] );
?>
もちろん、これは、コンストラクターがすべて、許容可能な値について解析される文字列引数を取る必要があることを意味します。 explodesとswitchステートメントを使用してこれを行うことができます。ランダムな推測に基づく不正アクセスを防ぐために、常にデフォルトで標準のフロントページに戻ります。
簡単な方法は、このように1つの変数のみをindex.phpに渡すことです。
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^(.*)$ index.php?data=$1 [QSA]
そしてあなたのindex.phpファイルであなたはこれをします
$data = expload("/",$_GET['data']);
$user = $data[1];
$action = $data[2];
これはすべての場合に機能します。多くの変数を渡そうとすると、次のようなことをしたときに無駄に機能しません。
http://localhost/user/add/12/54/54/66
最後の変数は常に値add/12/54/54/66
を取ります
ために /user/add
「中間パラメータ」がないため、別のルールを実行する必要があります。そう:
RewriteRule ^user/add$ ./index.php?action=add [L,QSA]
次に、追加のパラメーターを含むURLに対して追加のルールを実行できます。
RewriteRule ^user/([0-9]+)/([A-Za-z]+)$ ./index.php?user=$1&action=$2 [L,QSA]
これにより、既存のユーザーに対してアクションを実行できるようになります。例えば。 /user/1/update
簡単に試してみてください!
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^game/([0-9]+)/([_-0-9a-zA-Z]+)/?$ index.php?user=$1&action=$2 [L,NC]
それでおしまい !!