【问题标题】:Trouble with encoding special chars for URL through text input通过文本输入为 URL 编码特殊字符的问题
【发布时间】:2009-01-25 19:12:06
【问题描述】:

我正在使用 CodeIgniter 构建一个 PHP 应用程序。它类似于Let Me Google That For You,您将一个句子写入文本输入框,单击提交,然后您将被带到显示结果的 URL。我希望 URL 是人工可编辑的,并且相对简单。我已经绕过 CodeIgniter URL 路由,所以现在我的 URL 看起来像这样:

http://website.com/?q=this+is+a+normal+url

现在的问题是当句子包含特殊字符(如问号或反斜杠)时。这两个都与我当前的 .htaccess 重写规则相混淆,即使字符被编码也会发生。

http://website.com/?q=this+is+a+normal+url? OR
http://website.com/?q=this+is+a+normal+url%3F

起作用的是双重编码。例如,如果我将问号编码为%253F(其中 ? 编码为 %3F,% 符号编码为 %25)。这个网址可以正常使用。

http://website.com/?q=this+is+a+normal+url%253F

有人知道我可以在这里做什么吗?有没有一种聪明的方法可以对输入进行双重编码?我可以写一个.htaccess 重写规则来解决这个问题吗?我在这里不知所措。以下是我目前为大家使用的重写规则。

RewriteEngine on
RewriteCond %{QUERY_STRING} ^q=(.*)$
RewriteRule ^(.*)$ /index.php/app/create/%{QUERY_STRING}? [L]

注意:CodeIgniter 的工作方式是它们有一个index/application/function/parameter URL 设置。我现在正在为函数提供完整的查询字符串。

【问题讨论】:

  • 你能把你的重写规则添加到问题中吗?
  • 当然,原帖已经过编辑,包含了重写规则。
  • 是否需要这样重定向请求?

标签: php .htaccess codeigniter redirect


【解决方案1】:

如果您使用的是 Apache 2.2 及更高版本,您可以使用 B flag 强制对反向引用进行转义:

RewriteCond %{QUERY_STRING} ^q=.*
RewriteRule ^ /index.php/app/create/%0? [L,B]

【讨论】:

  • 谢谢!我更改了 .htaccess 文件以使用您拥有的文件,它完全按照我的需要工作。如果我有任何贡献,我会给你投票。
【解决方案2】:

我通常会做这样的人类可读的网址

$humanReadableUrl= implode("_",preg_split('/\W+/', trim($input), -1, PREG_SPLIT_NO_EMPTY)); 

它将删除所有非单词字符并在单词之间添加下划线

【讨论】:

  • 不幸的是,应用程序需要标点符号(用户想要输入感叹号、句号和问号)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 2011-02-11
  • 1970-01-01
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多