CodeIgniter URL
默认情况下,CodeIgniter 的 URL 旨在对搜索引擎和人类友好。它使用基于 段 的方法,而不是与动态系统同义的标准“查询字符串”方法:
https://example.com/news/article/my_article
你可以使用 URI 路由 功能灵活地定义 URL。
URI库 和 URL辅助函数 包含可以轻松使用 URI 数据的函数。
URL 结构
基本 URL 仅包含主机名
当你有基本 URL https://www.example.com/ 并想象以下 URL 时:
https://www.example.com/blog/news/2022/10?page=2
我们使用以下术语:
| 术语 | 例子 | 描述 | 
|---|---|---|
| 基本 URL | https://www.example.com/ | 基本 URL 通常表示为 baseURL。 | 
| URI 路径 | /blog/news/2022/10 | |
| 路由路径 | /blog/news/2022/10 | 相对于基本 URL 的 URI 路径。它也称为 URI 字符串。 | 
| 查询 | page=2 | 
基本 URL 包含子文件夹
当你有基本 URL https://www.example.com/ci-blog/ 并想象以下 URL 时:
https://www.example.com/ci-blog/blog/news/2022/10?page=2
我们使用以下术语:
| 术语 | 例子 | 描述 | 
|---|---|---|
| 基本 URL | https://www.example.com/ci-blog/ | 基本 URL 通常表示为 baseURL。 | 
| URI 路径 | /ci-blog/blog/news/2022/10 | |
| 路由路径 | /blog/news/2022/10 | 相对于基本 URL 的 URI 路径。它也称为 URI 字符串。 | 
| 查询 | page=2 | 
URI 安全性
在 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 block 中找到完整的 Unicode 范围列表。
删除 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 中,你可以定义一个位置块并使用 try_files 指令来获取与我们在上面的 Apache 配置中相同的效果:
location / {
    try_files $uri $uri/ /index.php$is_args$args;
}
这将首先查找与 URI 匹配的文件或目录(从 root 和 alias 指令的设置构造每个文件的完整路径),然后将请求以及任何参数发送到 index.php 文件。