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/newshttp://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-&gt;config-&gt;site_url() 您需要加载 URL Helper。 $this-&gt;load-&gt;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结尾反斜杠对SEO的影响(转)

url 编码的正斜杠破坏了我的 codeigniter 应用程序

Codeigniter重写URL用斜杠替换问号

URL最后结尾反斜杠(/)加与不加区别

Apache 重写:如何避免在省略 url 结尾斜杠时显示 url 参数?

nginx 重写URL尾部斜杠