带有 .htaccess 的漂亮 URL

Posted

技术标签:

【中文标题】带有 .htaccess 的漂亮 URL【英文标题】:Pretty URLs with .htaccess 【发布时间】:2014-09-24 16:37:46 【问题描述】:

我有一个网址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 比较陌生。

【问题讨论】:

基础知识,24ways.org/2013/url-rewriting-for-the-fearful 您的所有用户都是用字母还是数字标识的?或两者?例如。 /user/1, /user/BigChris, /user/BigChris1? @BigChris 仅限数字 【参考方案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

【讨论】:

expload 有一个不错的戒指。【参考方案2】:

试试这个很简单!

Options +FollowSymLinks
RewriteEngine On

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

就是这样!!

【讨论】:

【参考方案3】:

既然你用 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 语句来做到这一点,始终默认返回标准首页,以防止基于随机猜测的未经授权的访问。

【讨论】:

【参考方案4】:

如果你想转

http://www.yourwebsite.com/index.php?user=1&amp;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、更新等)。

在我看来,这比 (.*) 更干净、更安全,这基本上意味着几乎任何东西都可以接受。

【讨论】:

谢谢,但是 user = empty 怎么样?例如localhost/index.php?user&amp;action=add。我怎样才能使它成为localhost/user/add【参考方案5】:

你可以这样写:

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

【讨论】:

我知道这是一个相当古老的答案。但只是想让它知道任何回到这里的人,这个链接早就死了。【参考方案6】:

试试这个很简单:

Options +FollowSymLinks

RewriteEngine on

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

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

【讨论】:

【参考方案7】:

对于/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

【讨论】:

谢谢。我要试试这个。 啊该死的!我完全忘记了方括号!【参考方案8】:

感谢@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

通过在链接localhost/user/1234/update 上使用var_dump($_GET); 我得到了

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 做一些其他的事情。

【讨论】:

以上是关于带有 .htaccess 的漂亮 URL的主要内容,如果未能解决你的问题,请参考以下文章

带有 Angularjs/.htaccess 的漂亮 url

.htaccess : 带有任意数量+参数名称的漂亮 URL

HTACCESS RewriteRules 带有漂亮的 SEO 网址(不允许访问物理文件位置)

带有 CodeIgniter 的漂亮 URL

为啥我的 .htaccess 代码不能完美地用于漂亮的 URL

.htaccess 漂亮的网址,空格?