【问题标题】:Custom urls - giving each user a url自定义 url - 给每个用户一个 url
【发布时间】:2013-11-17 18:41:24
【问题描述】:

我正在建立一个网站,我想自定义用户的个人资料,以便他们的个人资料网址共享他们的姓名。例如,网站域是 www.example.com,用户的 url 是 www.example.com/username。

我假设这是一个约定,因为我在网络上都看到了这一点。这是通过为每个用户提供自己的目录来完成的吗?这会有多辛苦?

【问题讨论】:

标签: php .htaccess


【解决方案1】:

我真的不能证明使用 htaccess 来做这样的事情是合理的。我只使用 htaccess 通过一个 php 文件(我的根 index.php)路由所有内容,并让 php 整理出如何处理 url。例如,您可以这样做:

$uri = trim($_SERVER['REQUEST_URI'], '/');
$pieces = explode('/', $uri);
$username = $pieces[0];

然后用$username做点什么。

我解析和使用我的网址的方式比这要复杂一些,但这与您的问题无关。只要确保您所做的任何事情都能够解释任何可能的查询字符串等。

mod-rewrite 对性能不好,所以我不会滥用它。

根据您的 cmets 更新。

这只是对我的原始代码示例的轻微扩展:

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

这是您可以在 index.php 中执行的操作的示例:

$pieces = preg_split('-/-', $_SERVER['REQUEST_URI'], NULL, PREG_SPLIT_NO_EMPTY);
$username = $pieces[0];

include "users/{$username}.php";

现在您可以访问mysite.com/myUserNameHere,请求转到index.php,它会解析出用户名并包含该用户的文件。

就像你问的那样处理路由。我说我的路由比较复杂,但是我的使用复杂很多,所以不相关。我只是警告说,我的代码不考虑附加了查询字符串的 url,例如“mysite.com/someUser/?foo=bar”。在没有查询字符串的情况下解析 url 是一个简单的过程,您应该能够处理它。如果您在解析 url 时需要更多帮助,请发帖询问。

【讨论】:

  • 你说你的网址比你这里的更复杂,所以请告诉我在哪里可以学习做复杂的网址。我的项目要求用户不要看到 .php 扩展名,即使背面的页面有扩展名并且我不知道如何做这些事情。
  • @Iamcoder 我用准确的代码更新了我的答案,以解析用户名并包含特定于该用户的内容。有很多方法可以解决您的问题,但要决定您真正想做的事情需要您进行大量研究。
  • @lamcoder 你欣赏我的回答吗?如果这里有有用的答案,请单击您认为最好的答案旁边的接受复选标记。
  • @Iamcoder 有上下箭头,中间有一个数字 - 复选标记在其下方。
  • 我现在看到了箭头。我试图投票给你,但它说我必须有 15 个声望才能投票给你。你对我的问题投票了吗?
【解决方案2】:

您正在寻找RewriteRule。我认为应该这样做:

RewriteRule ^(.*)$ index.php?username=$1 [NC]

这会将显示的 url (www.example.com/myusername) 转换为带有 GET 参数的 index.php 的 url。您可以在内部使用的这个新网址如下所示:

www.example.com/index.php?username=myusername

更新:以下是回答您评论中问题的额外说明:

上面的 RewriteRule 完全符合您的要求。用户可以输入像www.example.com/username 这样的url,它将在内部被重写(用户不会注意到它)为www.example.com/index.php?username=myusername。这样您就可以访问 get 变量 ($_GET["username"]),而用户永远不会看到它存在。

可以在herehere 找到很好的教程。

【讨论】:

  • 不,Patrick,我的意思是我希望指向用户个人资料的链接链接到此 www.example.com/username,以便用户可以将其放在名片和类似性质的东西上。当用户单击“我的个人资料”时,链接将为 www.example.com/username。我遇到的一个问题是我需要来自链接本身的用户用户名才能从数据库中提取信息。因此,如果我没有来自 url 的 get 变量,这将如何工作?你能指导我看一些教程吗,因为我还想从我的所有链接中删除 .php 并仍然获得变量。任何帮助表示赞赏。
  • Patrick 感谢您的链接。我在发帖时犯了一个错误。我想要的是变量的值是用户名,这样我就可以使用用户名查询数据库。我会研究你给我的链接,以便更好地掌握事情。
  • RewriteEngine On 987654332 RewriteCond %{REQUEST_FILENAME} !-d 987654334 @ RewriteCond %{REQUEST_FILENAME}\.php !-f 987654336 RewriteCond %{REQUEST_FILENAME} !-d 987654338 RewriteRule ^/(.*)/(.*)$ ad.php?username=$1&title=$2 [NC,L] </Directory> span>
  • 这些是一些错误:[Thu Dec 26 21:42:54.790828 2013] [core:notice] [pid 3996:tid 456] AH00094: Command line: 'c:\\wamp\\bin\\apache\\apache2.4.4\\bin\\httpd.exe -d C:/wamp/bin/apache/Apache2.4.4'[Thu Dec 26 21:42:54.792803 2013] [mpm_winnt:notice] [pid 3996:tid 456] AH00418: Parent: Created child process 6352[Thu Dec 26 21:42:55.176419 2013] [mpm_winnt:notice] [pid 6352:tid 340] AH00354: Child: Starting 150 worker threads.[Sun Dec 29 10:07:34.187381 2013] [mpm_winnt:notice] [pid 3996:tid 456] AH00422: Parent: Received shutdown signal -- Shutting down the server.
  • 这并没有说明问题,我认为您最好针对这个特定问题创建一个新问题。您无法将足够的信息放入 cmets 以快速有效地解决此问题。
【解决方案3】:

您的意思不是“真正的”URI,而是重写。因此,使用 .htaccess,您可以将查看用户从 example.com/user 这样的常规 URI 重定向到 example.com/users.php?name=user,而他不会看到它。

这是一种约定,因为它有助于使 URI 更具可读性,它还 可以 让 Google 为该页面提供更好的排名,因为 URI 中可能有关键字,并且 URI 是更短,因此关键字更突出。

这是一个基本的重写,将 .htaccess 文件放在服务器上的某个位置(主要是在根目录中,这样它就可以从那里控制所有子文件夹):

 RewriteRule ^(.*)$ users.php?name=$1 [NC]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    相关资源
    最近更新 更多