web-dev-qa-db-ja.com

.htaccessのあるきれいなURL

私は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に比較的慣れていません。

10
Port 8080

@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を使って内部で他のことだけをします。

1
Port 8080

あなたはこのようなものを書くことができます:

RewriteEngine On
RewriteRule ^([^/]*)/([^/]*)$ /index.php?user=$1&action=$2 [L]
6
denoise

向きを変えたいなら

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'];
?>
  • .htaccessの括弧は、後で呼び出すことができるグループです。 $ 1、$ 2などで。
  • 私が追加した最初のグループ([0-9] *)は、任意の数(1、34など)を取得することを意味します。
  • 2番目のグループは、任意の文字(a、abc、updateなど)を意味します。

これは、私の意見では、(。*)よりも少しクリーンで安全です。これは基本的にほとんどすべてが受け入れられることを意味します。

5
mogosselin

これに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

そこから、最初の/に沿ってクエリ文字列を展開し、user18239810/updateを指定します。

これは、18239810/updateuserコントローラーに渡す必要があることを示しています。そのコントローラーで、引数を再びユーザー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ステートメントを使用してこれを行うことができます。ランダムな推測に基づく不正アクセスを防ぐために、常にデフォルトで標準のフロントページに戻ります。

2
stslavik

簡単な方法は、このように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を取ります

1
Khalid

ために /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

1
Kinnectus

簡単に試してみてください!

Options +FollowSymLinks
RewriteEngine On

RewriteRule ^game/([0-9]+)/([_-0-9a-zA-Z]+)/?$  index.php?user=$1&action=$2 [L,NC]

それでおしまい !!

1
Gavin