使用自定义 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的主要内容,如果未能解决你的问题,请参考以下文章