0

我正在使用 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/parameterURL 设置。我现在正在为函数提供完整的查询字符串。

4

2 回答 2

1

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

RewriteCond %{QUERY_STRING} ^q=.*
RewriteRule ^ /index.php/app/create/%0? [L,B]
于 2009-01-25T21:08:40.903 回答
0

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

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

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

于 2009-01-25T20:42:18.210 回答