带有 .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
从那里,沿着第一个/
展开查询字符串,得到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 语句来做到这一点,始终默认返回标准首页,以防止基于随机猜测的未经授权的访问。
【讨论】:
【参考方案4】:如果你想转
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、更新等)。
在我看来,这比 (.*) 更干净、更安全,这基本上意味着几乎任何东西都可以接受。
【讨论】:
谢谢,但是 user = empty 怎么样?例如localhost/index.php?user&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 网址(不允许访问物理文件位置)