【问题标题】:Htaccess and user accounts [duplicate]Htaccess和用户帐户[重复]
【发布时间】:2012-03-24 13:19:40
【问题描述】:

你知道 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 中产生一个重大错误。 www.mysite.com/indexwww.mysite.com/index2 转到同一页面,即使它们是两个不同的文件。对了,我已经在htaccess中设置了隐藏文件扩展名。

请帮帮我

【问题讨论】:

    标签: php html .htaccess


    【解决方案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."
    }
    

    您可以扩展它以定义 url 参数,以便 /users/someDude 将被发送到 users.php 并且类似 $routeParams['username'] 的值将具有 someDude

    【讨论】:

      【解决方案2】:
      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/ 中的所有内容都按预期授予,其他所有内容都路由到标签文件。 根据您的网站的复杂程度,这可能是一个好主意,也可能是坏主意。如果您的重点是用户并且您的其他页面很少(例如关于、常见问题、联系方式等),那么您应该没问题。否则你可能会陷入条件排序的噩梦。

      我以 tags.php 和 /accounts 为例。我不知道您网站的结构,所以我不知道您的确切需求。这应该足以让您入门。

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

      【讨论】:

      • 应该是正则表达式中?之前的/
      • 仅当 / 是可选的。在这种情况下,我认为不需要它,因为它应该与第一个 uri 段进行比较。我会编辑这篇文章,但我认为这会让我们的 cmets 非常困惑。
      猜你喜欢
      • 2013-06-22
      • 2016-08-16
      • 2011-01-02
      • 2023-04-03
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多