使用.htaccess的漂亮网址

时间:2014-08-01 12:58:02

标签: php apache .htaccess mod-rewrite

我有一个网址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

另外,如何制作此网址http://localhost/user/add? 谢谢。对不起,我对.htaccess相对较新。

8 个答案:

答案 0 :(得分:6)

你可以这样写:

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

答案 1 :(得分:5)

如果你想转

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等)。
  • 第二组表示任何字符 (a,abc,update等)。

在我看来,这比(。*)更加干净和安全,这基本上意味着几乎所有东西都被接受了。

答案 2 :(得分:2)

由于您使用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/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语句执行此操作,始终默认返回标准首页,以防止基于随机猜测的未经授权的访问。

答案 3 :(得分:1)

对于/user/add,您需要执行单独的规则,因为您没有&#34;中间参数&#34;。所以:

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

答案 4 :(得分:1)

感谢@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来做其他事情。

答案 5 :(得分:0)

一种简单的方法是只将一个变量传递给index.php,就像这样

Options +FollowSymLinks
RewriteEngine On

RewriteRule ^(.*)$ index.php?data=$1 [QSA]

并在index.php文件中执行此操作

$data = expload("/",$_GET['data']);
$user = $data[1];
$action = $data[2];

这个适用于所有情况,当你尝试传递许多变量时,当你执行类似

之类的操作时,它不适用于wase
http://localhost/user/add/12/54/54/66

最后一个变量总是取值add/12/54/54/66

答案 6 :(得分:0)

简单就是试试吧!

Options +FollowSymLinks
RewriteEngine On

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

多数民众赞成!!

答案 7 :(得分:-1)

试试这很简单:

Options +FollowSymLinks

RewriteEngine on

RewriteRule index/user/(.*)/(.*)/ index.php?user=$1&action=$2

RewriteRule index/user/(.*)/(.*) index.php?user=$1&action=$2