【问题标题】:creating thousands of urls through mod-rewrite通过 mod-rewrite 创建数千个 url
【发布时间】:2012-10-03 15:49:10
【问题描述】:

我正在编写一个网站,该网站在 mysql_database 中存储了很多用户,其中每个用户都有一个 ID 和个人资料名称(如 jim.button.1)以及其他字段。我想要一个具有以下结构的 url(通过例如用户 ID 上的 mysql_select 获取配置文件):www.mysite.com/jim.button.1

现在我知道我可以使用 mod_rewrite_rule 来做到这一点,但是对于成千上万的用户,我会得到一个非常大的 .htaccess 文件。顺便说一句,我目前还不是 mod 重写方面的专家,但我了解它的工作原理。

有没有办法做到这一点,比如一个或两个 mod_rewrite_rules 或者有另一种聪明的方法来完成这个?

欢迎所有帮助。

【问题讨论】:

    标签: php mysql .htaccess mod-rewrite


    【解决方案1】:

    您可以使用以下方法重写所有未映射到现有文件的 URL:

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} -s [OR]
        RewriteCond %{REQUEST_FILENAME} -l [OR]
        RewriteCond %{REQUEST_FILENAME} -d
        RewriteRule ^.*$ - [NC,L]
        RewriteRule ^.*$ index.php [NC,L]
    </IfModule>
    

    然后通过$_SERVER['REQUEST_URI'] 获取实际 URL。这是一个例子:

    $parts = parse_url($_SERVER['REQUEST_URI']);
    $user = $parts['path'];
    

    有关示例,请参阅 https://github.com/zendframework/ZendSkeletonApplication/blob/master/public/.htaccess

    【讨论】:

      【解决方案2】:

      你可以这样使用:

      RewriteEngine On
      RewriteRule ^(.+)$ users.php?user=$1 [QSA,L]
      

      在您的 users.php 中,您可以像这样获取用户:

      $user = $_GET['user'];
      // do your stuff with the user
      

      您必须对其进行微调以使其与您网站的其他部分集成,但您明白了。

      【讨论】:

      • 您的重写规则将匹配每个请求,因此不会提供实际文件(.css.js.jpg 等)。可能不是 OP 想要的。
      【解决方案3】:

      我会将 Ross Smith 和 JvdBerg 结合起来,这样你最终会得到类似的结果:

      <IfModule mod_rewrite.c>
          RewriteEngine On
          RewriteCond %{REQUEST_FILENAME} -s [OR]
          RewriteCond %{REQUEST_FILENAME} -l [OR]
          RewriteCond %{REQUEST_FILENAME} -d
          RewriteRule ^.*$ - [NC,L]
          RewriteRule ^(.*)$ profile.php?user=$1 [NC,L]
      </IfModule>
      

      这将使您的脚本更容易处理,而不必解析整个 URL。需要打开RewriteEngine 后的前 4 行,以便站点的其余部分可以继续运行(检查目录、文件、链接),如果 url 是一个,则使用第一条规则,不再处理。然后第二条规则是,如果它不是之前的规则之一,并重定向到您的“profile.php”页面。

      然后在你的“profile.php”页面中,你可以得到你的值:

      list($fname, $lname, $id) = explode('.', $_REQUEST['user']);
      

      然后从那里出发。

      【讨论】:

      • 我还想补充一点,如果您计划稍后添加更多规则,您现在应该尽可能具体地使用您的RewriteRule。因此,将RewriteRule ^(.*)$ profile.php?user=$1 [NC,L] 更改为RewriteRule ([a-zA-Z]+)\.([a-zA-Z]+)\.([0-9]+)$ profile.php?fname=$1&amp;lname=$2&amp;uid=$3 [NC,L] 并通过脚本中的$_REQUEST['fname']$_REQUEST['lname']$_REQUEST['uid'] 访问它们。它还将确保格式符合您的期望,并将 URI 限制为具有您期望的 PHP 字符集。
      • 我终于有时间实现这个了,你的回答很有用!谢谢。
      • 为什么投反对票?如果您要对某事投反对票,请至少发表评论说明原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多