CodeIgniter URL

默认情况下,CodeIgniter 的 URL 设计旨在对搜索引擎友好,同时也便于人类阅读。它不使用动态系统中常见的标准“查询字符串”形式,而是采用一种基于 分段 的方法:

https://example.com/news/article/my_article

你可以使用 URI 路由 功能灵活地定义 URL。

URI 库URL 库 包含了可以轻松处理 URI 数据的函数。

URL 结构

仅包含主机名的 Base URL

当你的 Base URL 为 https://www.example.com/ 时,假设有以下 URL:

https://www.example.com/blog/news/2022/10?page=2

我们使用以下术语:

术语

示例

描述

Base URL

https://www.example.com/

Base URL 通常表示为 baseURL

URI path

/blog/news/2022/10

Route path

/blog/news/2022/10

相对于 Base URL 的 URI 路径。 也称为 URI string

Query

page=2

包含子文件夹的 Base URL

当你的 Base URL 为 https://www.example.com/ci-blog/ 时,假设有以下 URL:

https://www.example.com/ci-blog/blog/news/2022/10?page=2

我们使用以下术语:

术语

示例

描述

Base URL

https://www.example.com/ci-blog/

Base URL 通常表示为 baseURL

URI path

/ci-blog/blog/news/2022/10

Route path

/blog/news/2022/10

相对于 Base URL 的 URI 路径。 也称为 URI string

Query

page=2

URI 安全

Added in version 4.4.7.

重要

从 v4.4.7 之前的版本升级的用户需要在 app/Config/App.php 中添加以下配置 才能使用此功能:

public string $permittedURIChars = 'a-z 0-9~%.:_\-';

为了帮助减少恶意数据传递到应用程序的可能性,CodeIgniter 对 URI 字符串(路由路径)中允许使用的字符有相当严格的限制。URI 只能包含下列字符:

  • 字母数字文本(仅限拉丁字符)

  • 波浪号:~

  • 百分号:%

  • 句点:.

  • 冒号::

  • 下划线:_

  • 减号:-

  • 空格:`` ``

备注

此检查由 Router 执行。Router 接收 SiteURI 类保存的 URL 编码值, 解码后检查其是否包含不允许的字符串。

添加允许的字符

允许的字符可以通过 Config\App::$permittedURIChars 修改。

如果要在 URI 路径中使用 Unicode,需要修改它以允许使用这些字符。 例如,如果要使用孟加拉语,需要在 app/Config/App.php 中设置以下值:

public string $permittedURIChars = 'a-z 0-9~%.:_\-\x{0980}-\x{09ff}';

完整的 Unicode 范围列表可以在维基百科的 Unicode block 中找到。

移除 index.php 文件

当使用 Apache Web 服务器时,默认情况下,URL 中需要包含 index.php 文件:

example.com/index.php/news/article/my_article

如果服务器支持 URL 重写,你可以通过 URL 重写轻松移除这个文件。 不同的服务器处理方式不同,但这里我们将展示两种最常见的 Web 服务器示例。

Apache Web 服务器

Apache 必须启用 mod_rewrite 扩展。如果已启用,你可以使用 .htaccess 文件配合一些简单的规则。 以下是一个示例,它采用了“排除法”:即除了指定项之外,其他所有请求都会被重定向:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

在此示例中,除了针对现有目录和现有文件的请求外,任何其他 HTTP 请求都会被视为对你的 index.php 文件的请求。

备注

这些特定规则可能不适用于所有服务器配置。

备注

确保从上述规则中排除任何需要从外部访问的资源文件。

Nginx

在 Nginx 中,你可以定义一个 location 块并使用 try_files 指令来实现与上述 Apache 配置相同的效果:

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

这将首先查找与 URI 匹配的文件或目录(根据 root 和 alias 指令的设置构造每个文件的完整路径), 然后将请求连同任何参数一起发送给 index.php 文件。