首页 > 解决方案 > 为什么 index.php 在 codeigniter 中以第一段为前缀的 url 有效 | 代码点火器 | 重写条件

问题描述

我正在做一个 CodeIgniter 项目,今天我发现了一个非常奇怪的问题。

index.php当我打开第一段中带有前缀的 URL 时,即使我希望 URL 返回一个404 Not Found页面,它仍然可以工作。

例如,我的网站的 URL 是http://localhost/project,当我打开 URLhttp://localhost/project/jobs时它可以正常工作,但是当我打开http://localhost/project/index.phpjobs它时它也可以工作。

我不知道这里发生了什么事!

请注意,该 URL不包含斜杠,但仍在工作,这不是错字。

请检查您的项目,如果有人有同样的问题,请告诉我,因为我认为这个问题也可能存在于您当前的项目中,但没有注意到。

.htaccess

RewriteEngine On

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

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

RewriteRule ^.well-known/ - [L,NC]

标签: phpcodeignitermod-rewrite

解决方案


你的第一个重写规则

RewriteRule ^admin(.*)$ admin/index.php?/$1 [L]

仅当满足前两个条件时才会兑现

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

已经遇到了。

现在,诀窍在于这些条件,基本上说只有当请求的资源(REQUEST_FILENAME此处)不作为文件或文件夹存在时,才会执行重写。

由于index.php显然存在重写规则,因此服务器实际上接收到原始(非重写)请求。

这就是为什么对于包含和不包含/index.php/前缀的请求,您会看到相同结果的原因。

这同样适用于两组重写,用于管理页面的一组和常规的一组。


推荐阅读