你知道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}
,它又会带我到家里。这会在网址中产生重大错误。 www.mysite.com/index
和www.mysite.com/index2
即使是两个不同的文件也会转到同一页面。顺便说一下,我已经在htaccess中设置了隐藏文件扩展名。
请帮帮我
答案 0 :(得分:1)
RewriteRule ^(.*)?$ tags/tags.php?name=$1 [NC,L]
仅此一项就会将所有内容重写为tags / tags.php文件。 您可以使用条件来排除某些重要路径。
RewriteCond %{REQUEST_URI} !^\/?accounts[.*]$ [NC]
RewriteRule ^(.*)?$ tags/tags.php?name=$1 [NC,L]
...我认为重写条件语法是正确的,但我还没有测试过它......
因此,帐户/中的所有内容都按预期授予,其他所有内容都会路由到代码文件。 根据您网站的复杂程度,这可能是一个好主意或坏主意。如果您的重点是用户,而您几乎没有其他页面(如约,常见问题,联系方式等),那么您应该没问题。否则你可能会陷入噩梦中进行条件排序。
我使用tags.php作为示例以及/ accounts。我不知道您网站的结构,所以我不知道您的确切需求。这应该足以让你入门。
我的观点是,您可能必须准备好在tags.php htaccess规则之上有很多条件,因为您要与第一个uri段进行比较。如果您的希望之路更像是www.yoursite.com/user/username,那将会更容易。
答案 1 :(得分:1)
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."
}
您可以对其进行展开以定义网址参数,以便将/users/someDude
发送到users.php
,$routeParams['username']
之类的内容的值为someDude
。