漂亮的URL与.htaccess

我有一个URL http://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

另外我怎么能使这个urlhttp://localhost/user/add ? 谢谢。 对不起,我对.htaccess比较新。

你可以写这样的东西:

 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]*)/([az]*)$ ./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等)。
  • 第二组意味着任何字符(a,abc,update等)。

在我看来,这比(。*)更干净,更安全,这几乎意味着任何事情都被接受。

既然你用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控制器。 在那个控制器中,我再次将参数分解到用户标识和命令中,我可以打开命令来告诉如何加载页面,并将用户标识作为参数传递给update函数。

非常快速和肮脏的例子(index.php):

 <?php $getString = explode('/', $_GET['q'], 1); $controller = $getString[0].'Controller'; require_once('/controllers/'.$controller.'.php'); $loadedController = new $controller( $getString[1] ); ?> 

当然,这意味着构造函数都必须接受一个字符串参数,该参数将被解析为可接受的值。 您可以使用爆炸和切换语句来做到这一点,总是默认回到标准的首页,以防止基于随机猜测的未经授权的访问。

感谢@denoise和@mogosselin。 另外用@stslavik指出我的代码示例的一些缺点。

以下是我如何做到这一点:

 Options +FollowSymLinks RewriteEngine On RewriteRule ^user/([0-9]*)/([az]*)$ ./index.php?user=$1&action=$2 RewriteRule ^user/([az]*)$ ./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来做其他的事情。

对于/user/add你将需要做一个单独的规则,因为你没有“中间参数”。 所以:

 RewriteRule ^user/add$ ./index.php?action=add [L,QSA] 

然后,您可以为包含其他参数的网址执行其他规则:

 RewriteRule ^user/([0-9]+)/([A-Za-z]+)$ ./index.php?user=$1&action=$2 [L,QSA] 

这将允许您对现有用户执行操作。 例如/user/1/update

一个简单的方法就是像这样只传递一个变量到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

它的简单只是试试这个!

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

而已 !!

试试这很简单:

 Options +FollowSymLinks RewriteEngine on RewriteRule index/user/(.*)/(.*)/ index.php?user=$1&action=$2 RewriteRule index/user/(.*)/(.*) index.php?user=$1&action=$2