Php URL中的尾随%20空格在Codeigniter中产生404错误

Php URL中的尾随%20空格在Codeigniter中产生404错误,php,apache,.htaccess,codeigniter,Php,Apache,.htaccess,Codeigniter,带有URL编码的尾随空格(%20)的URL正在生成404错误。该应用程序在Apache上的Codeigniter上运行 /directory/page%20将返回404错误 /directory/page将返回200 OK 如何将所有尾随%20的URL路由到目标URL?@Juan Cullen,当尾随斜杠前有空格时,这是一个常见问题。例如,让我们说:“/”。您可以注意到尾随斜杠前的空格 要解决所有具有这种行为的URL的问题,可以使用PHP的rtrim()函数 检查下面的代码 <?php

带有URL编码的尾随空格(
%20
)的URL正在生成404错误。该应用程序在Apache上的Codeigniter上运行

  • /directory/page%20
    将返回404错误

  • /directory/page
    将返回200 OK


如何将所有尾随
%20
的URL路由到目标URL?

@Juan Cullen,当尾随斜杠前有空格时,这是一个常见问题。例如,让我们说:“/”。您可以注意到尾随斜杠前的空格

要解决所有具有这种行为的URL的问题,可以使用PHP的rtrim()函数

检查下面的代码

<?php

function fix_url($url) {
    $trailing_slash = ' /'; //notice a space before the slash
    return $url = rtrim($url, $trailing_slash);
}
当您使用Codeigniter时,您可以将此函数放在一个帮助文件中,并在任何地方访问它

这是一个想法尝试一下,让我知道它是否有效


问题是,一些第三方网站链接到我们时在HREF中留下了空白

在这种情况下,您可以在
.htaccess
文件的顶部添加类似于以下内容的内容,以重定向(规范化)此类请求以删除尾部空格

例如,在Codeigniter前控制器之前:

RewriteCond %{REQUEST_URI} \s$
RewriteRule (.*) /$1 [R=302,L]
RewriteRule
模式匹配的“已处理”URL路径已删除尾部斜杠,但是,
REQUEST\u URI
服务器变量尚未删除。因此,我们可以检查
REQUEST_URI
上的尾随空格,并简单地重定向到
RewriteRule
模式捕获的“相同”(已处理)URL路径

REQUEST\u URI
服务器变量已被解码。
\s
速记字符类与任何空白字符匹配,尾随的
$
将其锚定到URL路径的末尾


首先使用302(临时)重定向进行测试,以确保其在更改为301(永久)重定向之前工作正常。

在URL编码之前,只需修剪URL即可?解决问题的原因比根据症状采取行动要好。这里的问题是有一个额外的空间,而不是路由器将其视为一个不同的路由。问题是一些第三方网站在HREF中使用尾随空格链接到我们。即使如此,在您通过CI中的路由对URL进行URL编码之前,我也不确定在何处添加此函数以影响URL。谢谢。我给出的示例没有尾随斜杠。即使如此,我也不确定在哪里添加此函数来影响CI中的路由。@JuanCullen-如果它没有尾随斜杠,请尝试添加:
$\u SERVER['REQUEST\u URI']=trim($\u SERVER['REQUEST\u URI'])作为
index.php
中的第一行(在开始
之后,谢谢怀特先生。我查看了你的答案。代码返回了一个重定向循环。因此我修改了答案,并使用了以下内容:'RewriteRule^(.*)s$/$1[R=301,L]'好奇……您使用的是什么版本的Apache?您的
.htaccess
文件中还有哪些其他指令?我回答中的代码不应该导致重定向循环(已测试的Apache 2.2和2.4)。可能与现有指令存在冲突?但是,我不希望您建议的
重写规则在Apache上完全匹配?(您是否使用LiteSpeed?!)我正在使用Apache 2.4,我有大约25个其他重写规则将旧URL重定向到应用程序的新URL结构。所有这些规则都非常简单,例如重写规则^package/([a-zA-Z0-9-]+)-([0-9]+)(html | php)$/deals/view/$1[L,R=301]
RewriteCond %{REQUEST_URI} \s$
RewriteRule (.*) /$1 [R=302,L]