使用自定义 htaccess mod 重写时有效路由上的 Codeigniter 404

Posted

技术标签:

【中文标题】使用自定义 htaccess mod 重写时有效路由上的 Codeigniter 404【英文标题】:Codeigniter 404 on valid routes when using custom htaccess mod rewrites 【发布时间】:2015-11-03 03:58:31 【问题描述】:

我在使用自定义(有点奇怪)htaccess 文件夹映射时遇到了 codeignighter 问题。但是,它在技术上应该可以工作,但事实并非如此。有人可以帮我吗?


场景 1(工作正常):

文件夹结构和关键文件

/ is the website root
/.htaccess
/api/ <this is the CodeIgniter Root, with index.php and default CI .htaccess>

/.htaccess:

RewriteEngine On
RewriteRule ^api/(.*)$ /api/$1 [L]

例如访问 mydomain.com/api/admin/ 可以让我进入我的 admin-controller/index 操作并正常加载视图。

index.php 上的 var_dump 显示 $_REQUEST

array (size=1)
'admin/' => string '' (length=0)

场景 2(不起作用):

文件夹结构和关键文件

/.htaccess
/current/.htaccess
/current/api/ <this is the CodeIgniter Root, with index.php and default CI .htaccess, this is the same folder/files/htaccess as above scenario>

/.htaccess:

RewriteEngine On
RewriteRule ^(.*)$ /current/$1 [L]

/current/.htaccess:

RewriteEngine On
RewriteRule ^api/(.*)$ /api/$1 [L]

例如访问 mydomain.com/api/admin/ 可以让我进入 Codeigniter 404 页面/视图。

index.php 上的 var_dump 用于 $_REQUEST 显示(与场景 1 相同)

array (size=1)
'admin/' => string '' (length=0)

这里发生了什么?我知道 htaccess 重写很奇怪,但就 Codeigniter 所见,路线是相同的 (admin/)。但他们俩的行为不同。为什么?我尝试了我能想到的一切,据我所知,codeigniter 看到了请求对象的正确路径,但 CI 路由器不知何故没有正确使用它。

感谢任何帮助,如果您能想到任何我可以尝试帮助进一步调试的方法,请告诉我。

注意:我使用双 htaccess 的原因是我可以根据时间/场景安排不同的 CI 实例(您可以使用重写条件来提供不同的文件夹而不是“当前”文件夹)。我目前没有使用这个,所以在场景 2 中,根目录只有一个“当前”文件夹。

【问题讨论】:

试试这个RewriteRule ^api/(.*)$ /api/index.php/$1 [L] api文件夹中的资产文件呢?与 codeigniter 一样,api/assets/mylogo.jpg 呢?对此的任何请求都将进入 codeigniter php 文件并以 404 的形式出现。我错了吗? 澄清一下,api文件夹还包含一个htaccess文件,通常的CI htaccess文件:pastebin.com/aHM9cjtr问题中提到 当你在你的 php 文件中调用 mylogo.jpg 时它不会出错?但是如果你输入 url 那么它会出错。所以它起到防盗链的作用 我认为你不明白这一点。我需要 api 文件夹中的所有内容都能正常工作。链接到 CI 中的页面、链接到图像或任何其他存在的资产。我认为您完全忽略了问题的重点。附言。在您的解决方案的这种情况下,“热链接保护”是一个错误而不是一个功能。 【参考方案1】:

从 CodeIgniter 的 URI 中删除 index.php 可能会很痛苦。上周我遇到了类似的情况:我的根 Web 目录位于 /var/www/html/ci 我的项目内......所以在 /ci 内我有以下 .htaccess:

RewriteEngine on
RewriteCond $1 !^(index\.php)
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

在 apache2 配置文件中我添加了以下内容:

<Directory /var/www/html/ci/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

同时检查 application/config/config.php 你有:

$config['uri_protocol'] = 'REQUEST_URI';

希望对您有所帮助...

【讨论】:

【参考方案2】:

您将请求重定向到一个文件夹,而实际上您应该将这些请求重定向到 CodeIgniter 的 index.php 文件。

例如:

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

假设您在配置文件中将“index_page”设置为空字符串,如果它设置为 index.php,那么在请求某些内容时,您应该在 url 中包含 index.php。

【讨论】:

api 文件夹中的资产文件呢?与 codeigniter 一样,api/assets/mylogo.jpg 呢?对此的任何请求都将进入 codeigniter php 文件并以 404 的形式出现。我错了吗? 澄清一下,api文件夹还包含一个htaccess文件,通常的CI htaccess文件:pastebin.com/aHM9cjtr问题中提到 你已经定义了它,!-f & !-d 这意味着,如果某些不是文件或不是请求的目录,它将通过 codeigniter 的 index.php 文件.这意味着您应该能够以正常方式请求您的资产。

以上是关于使用自定义 htaccess mod 重写时有效路由上的 Codeigniter 404的主要内容,如果未能解决你的问题,请参考以下文章

htaccess 条件重写规则与 mod_GeoIP

PHP 内置服务器和 .htaccess mod 重写

htaccess mod 用斜杠将 $_GET 重写为变量

没有 .htaccess 的 Mod 重写

mod_rewrite 适用于 .htaccess 文件,但不适用于 apache2.conf

有没有办法在不使用mod_rewrite和.htaccess的情况下重写我的网址?