Htaccess和用户帐户


Htaccess and user accounts

你知道twitter是如何这样写网址的吗:twitter.com/{username}?

他们是如何做到这一点的?一定有一些htaccess编码参与其中。我尝试过,但当它是用户名或其他什么时,我的代码会被混淆,并一次又一次地显示同一页面。

这是我的代码:

RewriteRule ^([^/]+)$ login/id.php?name=$1
RewriteRule ^#/([^/]+)$ tags/tag.php?name=$1

因此,如果我写www.mysite.com,它会带我进入主页,如果我键入www.mysite.com/{random name that is not a register user},它会再次带我进入首页。这在url中创建了一个主要错误。CCD_ 2和CCD_。顺便说一句,我已经在htaccess中设置了隐藏文件扩展名。

请帮助我

htaccess不是性能最好的,而且比用php处理路由更受限制。首先,您只使用htaccess将大多数请求定向到php文件:

RewriteCond %{REQUEST_URI} !'.(png|jpe?g|gif|css|js|html)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ index.php [L]

然后,您的路由可以简单到:

$pieces = preg_split('-/-', $_SERVER['REQUEST_URI'], NULL, PREG_SPLIT_NO_EMPTY);
$username = $pieces[0];
include "users/{$username}.php";

但是在实际的应用程序环境中还有很多事情要做。有许多php框架内置了路由功能,你可能会感兴趣。任何主要的框架都会包括这一点。

以下是之前类似帖子中这个答案的略微扩展版本:https://stackoverflow.com/a/20034826/1435655

为了进一步扩展,大多数路由系统使用的基本思想是写出您接受的路由以及处理它们的方法。当收到请求时,会搜索这些路由,直到找到匹配的路由。这样想:

$myRoutes = [
  '/' => 'home.php',
  '/about' => 'about.php'
  //etc
];
$route = $_SERVER['REQUEST_URI'];
if (in_array($route, $myRoutes)) {
  include $myRoutes[$route];
}
else {
  echo "Go to a real page. This one doesn't exist."
}

您可以扩展它来定义url参数,这样/users/someDude将被发送到users.php,类似$routeParams['username']的值将为someDude

RewriteRule ^(.*)?$ tags/tags.php?name=$1 [NC,L]

仅此一项就可以将所有内容重写到tags/tags.php文件中。您可以使用条件语句来排除某些重要路径。

RewriteCond %{REQUEST_URI} !^'/?accounts[.*]$ [NC]
RewriteRule ^(.*)?$ tags/tags.php?name=$1 [NC,L]

我认为重写条件语法是正确的,但我还没有测试它。。。

因此,accounts/中的所有内容都按预期授予,其他所有内容都路由到标记文件。根据你的网站有多复杂,这可能是个好主意,也可能是个坏主意。如果你的重点是用户,而你几乎没有其他页面(比如about、faq、contact等),那么你应该没事。否则,您可能会陷入条件排序的噩梦。

我用tags.php和/accounts作为例子。我不知道你们网站的结构,所以我不知道你的确切需求。这应该足以让你开始。

我的观点是,您可能必须准备好在tags.php htaccess规则之上有很多条件,因为您正在与第一个uri段进行比较。如果你的希望之路更像www.yoursite.com/user/username,那会容易得多。