【问题标题】:How do i script dynamic URLs for my site with php?如何使用 php 为我的网站编写动态 URL 脚本?
【发布时间】:2015-02-03 19:01:58
【问题描述】:

在我的 Web 服务器文档根目录中,我创建了文件夹 /user/,其中包含 /index.php 脚本。无论当前(授权)用户,我都需要创建一个页面,在我的网站上向 anyone 显示有关 any 用户的信息,我有一个使用查询字符串的想法:

site.com/user/?id=3

但我不想这样做。我想要类似 GitHub 的 url,像这样:

site.com/user/UserName/

另外,我需要允许 URL 延续以指定请求哪个“操作”,例如 subscribecomments,以及指定用户名的参数:

site.com/user/Admin/comments/32
site.com/user/Admin/virtual/path/

这应该是对物理路径的简单重写:`/user/index.php'。

我是 PHP 新手,但我了解 mod_rewrite 和 .htaccess 的基础知识,但我仍然不明白如何确定 URL 请求的用户 (Admin) 和操作 (comments),在我的 PHP 脚本中 index.php.

请教我如何才能为我的网站访问此 URL 语法?或者更好的是,如何将/user/Admin/comments 重定向到物理/user/comments.php..

  1. 如何通过保存用户名/操作为 php 脚本设置这种动态重写?
  2. 脚本如何访问 URL 请求的用户名和操作(comments32
  3. 我应该如何重命名我的问题,因为这个标题似乎不正确。

对不起,长文,我是干净的 PHP 脚本的新手,谢谢!

【问题讨论】:

标签: php apache .htaccess url-rewriting


【解决方案1】:

如果真的想自己做,如果你这样做也没关系,这是你需要做的一个例子。我了解并非每个人都需要或想要使用框架。

首先假设您的用户 URL 类似于 Github 示例。

http://www.yoursite.com/user/dmitrij 

然后,对于您的 .htaccess,您将需要这样的重写规则。

    RewriteEngine On
    # check to make sure the request is not for a real file
    RewriteCond %{REQUEST_FILENAME} !-f
    # check to make sure the request is not for a real directory
    RewriteCond %{REQUEST_FILENAME} !-d
    #route request to index.php
    RewriteRule ^user/([^/]+)/? /user/index.php?id=$1 [L]

那么如果你想显示 cmets,你的 URL 可以是这样的

http://www.yoursite.com/user/dmitrij/comments/32

然后你可以使用 .htaccess

    RewriteEngine On
    # check to make sure the request is not for a real file
    RewriteCond %{REQUEST_FILENAME} !-f
    # check to make sure the request is not for a real directory
    RewriteCond %{REQUEST_FILENAME} !-d
    #route request to index.php
    RewriteRule ^user/([^/]+)/comments/([0-9]+)/? /user/index.php?id=$1&comment_id=$2 [L]

然后,您可以将它们全部放在您的 .htaccess 文件中,用于两个 URL。

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^user/([^/]+)/comments/([0-9]+)/? /user/index.php?id=$1&comment_id=$2 [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^user/([^/]+)/? /user/index.php?id=$1 [L]

然后在您的index.php 中,您将检查$_GET 请求。 这是一个非常简单的例子。

<?php

 $username = $_GET["id"];
 $com_id = $_GET["comment_id"];

 print_r($username);
 exit;

?>

确保在服务器上启用了mod_rewrite,并且在您的虚拟主机或配置文件中设置了AllowOverride All

您可以对$_GET 中的值做任何您想做的事情。您必须确保 username 在您的数据库中是唯一的。您还可以为不同的 URL 添加更多重写,我不会在这里介绍。 这应该会给你一个好的开始。

【讨论】:

  • 我之前没有注意到RewriteRule 可以将正则表达式值重写为结果路径查询字符串......真的。谢谢!
  • @DmitrijA 是的,有很多方法可以为您的 URL 创建重写,您应该能够为您想要的任何类型进行重写。很高兴这对您有所帮助。
【解决方案2】:

使用URL-Rewrite-Engine 或使用MVC 框架(如symfonycakePHP)开始编程,其中包含功能

【讨论】:

  • 如果可能的话,真的不想使用任何框架,除非它们不仅适合我的任务..
  • 那么你需要一个 url 重写引擎
  • symfony 看起来很不错,谢谢你的建议。我真的很想念 PHP 中的 MVC 模式。
  • symfony 确实很好用,但是你需要一些时间才能进入它,因为有些部分可能有点复杂,但因此你可以通过包含其他库来节省大量时间,...它们被称为捆绑包
  • 非常感谢,太棒了。
【解决方案3】:

就像上面的答案 - 您需要启用 mod_rewrite,然后在您的 .htaccess 文件中提供映射模式。

我相信您还必须确保您的虚拟主机配置为

`Allow Override ALL`

此页面提供了很好的详细信息 - 向下滚动到标题为“如何重写 url”的部分。

http://www.smashingmagazine.com/2011/11/02/introduction-to-url-rewriting/

【讨论】:

  • 我已经安装/启用了重写引擎运行的站点。感谢您的文章,我发现对我来说有些新东西!
  • AllowOverride中没有空格
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
  • 2012-02-29
  • 2015-10-07
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多