Codeigniter - 当 URL 以斜杠结尾时,相对 URL 停止工作?
Posted
技术标签:
【中文标题】Codeigniter - 当 URL 以斜杠结尾时,相对 URL 停止工作?【英文标题】:Code Igniter - relative URLs stop working when URL ends in slash? 【发布时间】:2012-10-11 12:01:25 【问题描述】:我正在尝试学习 CI,并且刚刚完成了 starter tutorial。我发现如果我的 URL 以斜杠结尾,则某些链接 HREF 不起作用 - 例如,这些链接:
<?php foreach ($news as $news_item): ?>
<h2><?php echo $news_item['title'] ?></h2>
<div id="main">
<?php echo $news_item['text'] ?>
</div>
<p><a href="news/<?php echo $news_item['slug'] ?>">View article</a></p>
<?php endforeach ?>
当我打开时,故事的链接可以正常工作
/index.php/news
但如果我在,则不会
/index.php/news/
正如我所说,这是教程中的内容,所以我不确定发生了什么。
我可以让 HREF 成为绝对的......
<p><a href="<?php echo config_item('base_url').config_item('index_page').'/news/'.$news_item['slug']; ?>">View article</a></p>
...但我认为我不应该这样做。
有什么想法吗?
【问题讨论】:
为什么?这不是 Web 开发的一般要求,CI 自己的教程没有这样做。 CodeIgniter 有site_url()
函数可以解决你的问题(它会生成绝对 URL)。问题不是 codeigniter 问题,而是相对 url 首先是如何工作的。请看我的回答。
【参考方案1】:
把它变成这样:
<a href="/news/<?php echo $news_item['slug'] ?>">View article</a>
只是在开头添加斜线
更新:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteCond $1 !^(index\.php|uploads|robots\.txt|favicon\.ico)
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /index.php [L]
</IfModule>
将此添加到应用程序根目录中的 .htaccess 文件和 codeigniter 的配置文件中:
$config['index_page'] = ''; //make it like this
现在您不必使用 /index/news,只需使用站点根目录下的 /news 即可
那么你可以像这样使用它:
<a href="/news/<?php echo $news_item['slug'] ?>">View article</a>
它关闭了工作
【讨论】:
仅当站点位于服务器根目录中时,这是一个选项。 谢谢,我会看看这个,但我很好奇为什么这一切都是必要的。 CI 不支持处理这样的事情吗?这是来自他们自己的 CI,所以为什么其中有一些不起作用的东西,我不知道。 是的,这是他们文档中的缺失 (编辑:我的意思当然是“来自他们自己的教程”,而不是“CI”) 我发现这篇文章特别有帮助,我使用了 mod_rewrite,但很不高兴看到 site_url() 和 anchor() 构建的 url 仍然有 index.php 问题通过 $config[ 'index_page'] = '';【参考方案2】:此处可能没有足够的信息来诊断问题。 “不起作用”——错误是什么? 完整的 URL 是什么样的?
这可能与您的 Apache 和服务器配置有关。尝试编辑配置并尝试使用“PATH_INFO”与“REQUEST_URI”。
| 'AUTO' Default - auto detects
| 'PATH_INFO' Uses the PATH_INFO
| 'QUERY_STRING' Uses the QUERY_STRING
| 'REQUEST_URI' Uses the REQUEST_URI
| 'ORIG_PATH_INFO' Uses the ORIG_PATH_INFO
|
*/
$config['uri_protocol'] = 'AUTO';
最后,(这只是稍微相关)但在 Codeigniter 中构建 URL 的最佳方法是 site_url() 函数(它创建一个完整的 URL):
echo site_url("news/local/123");
【讨论】:
谢谢,但我认为从我的问题中可以清楚地看出什么“不起作用”。正如我所说,当 URL 中有斜杠时,页面中的相对链接将停止工作。本教程让我们创建一个新闻索引页面,列出来自 DB - /news 的故事。故事的链接是 /news/slug。如果查看新闻索引页面时带有尾部斜杠,CI 会错误地呈现这些故事链接的 HREF。 你好。我想我只是说你不够清楚。我认为您应该考虑将问题放入您的问题以使其更清楚的是a)它是否是404错误b)它是否显示错误的页面c)其他一些错误。然后是关于 URL 栏的内容……完整的 URL,例如。http://localhost/index.php/news
与 http://localhost/index.php/news/
。所有这些都会影响您的具体情况。【参考方案3】:
如果您有以下格式的网址,则相对网址将无法按您的预期工作:
http://domain.com/stuff/ http://domain.com/stuff/things原因是因为相对 url 使用完整的 URI 路径作为参考(因此是“相对”)。因此,如果您在 /stuff/things
的 URI 路径上引用 stuff/things
(注意前面的斜杠)(注意没有结束斜杠),您将获得 /stuff/stuff/things
,因为它假定您需要在 stuff
文件夹中的某些内容。
我要做的是使用 CodeIgniter 的 site_url()
函数,因为它会为您生成绝对 URL(包括域)。
site_url('stuff/things')
将变为 http://domain.com/stuff/things
对于这种情况,请在锚点的 href 中使用 echo site_url('news/'.$news_item['slug']);
。您也可以使用echo anchor('news/'.$news_item['slug'], 'Link text to this article');
来回显文章的链接,而无需编写 html。
一个警告——site_url()
将在 URI 中包含 index.php
(如果它尚未从您的配置文件中删除),因此如果您想引用图像、javascript、css 等,请使用 base_url()
它只会引用您的 base_path
配置变量。
编辑:忘了提及,您需要使用URL Helper 才能使这些功能正常工作。
【讨论】:
谢谢。不过,我仍然很困惑我是如何从他们自己的教程中遇到这个问题的——我没有改变任何事情。您会认为本教程可以开箱即用。回复:删除索引文件,我不确定你的意思。另一位回答者提到了这一点;我只是在配置中为index_page
设置了一个空值吗?这样做似乎会破坏整个网站。
我是否必须加载一些库才能使site_url()
工作?该函数似乎没有定义(通过function_exists()
确认)EDIT - 似乎应该是$this->config->site_url()
您需要加载 URL Helper。 $this->load->helper('url')
或将其添加到您的 autoload.php 中的 helpers 数组下的 application/config 文件夹中。仅当您在 apache 或 nginx(或任何您的网络服务器)中进行 url 重写时,从 index_page
中删除 index.php 才有效。【参考方案4】:
也许为时已晚,但我遇到了这个问题,尽管做了所有的建议,问题仍然存在! 现在终于可以用了,放
$config['base_url'] = '/myrootfolder/';
而不是
$config['base_url'] = 'http://localhost/myrootfolder/';
【讨论】:
【参考方案5】:打开你的 config.php 然后删除 index.php 。
然后使用
echo base_url('news').'/'.$news_item['slug']
然后像这样配置你的路线
$route['news/(:any)'] = 'news/index/$1';
【讨论】:
'remove' 我猜你的意思是将配置项设置为一个空字符串,而不是完全删除它。我这样做了,并使用了base_url()
函数,但现在 a) 新闻项不再出现在新闻索引上; b)转到站点根目录会引发页面未找到(不是 CI 生成的 404)以上是关于Codeigniter - 当 URL 以斜杠结尾时,相对 URL 停止工作?的主要内容,如果未能解决你的问题,请参考以下文章
url 编码的正斜杠破坏了我的 codeigniter 应用程序