1

考虑以下场景:

我希望能够访问http://www.example.com/word/hello/,其中单词hello是可变的。所以我开始.htaccess配置它。

RewriteEngine On
RewriteRule ^word/(.+)/?$ displayword.php?word=$1 [L]

我使用.+是因为我还想过滤任何符号,例如?+-.!;:等。

我相应地设置了我的 PHP 文件:

<?php
echo $_GET['word'];
?>

请记住,这只是一个场景。现在,我访问了这个 URL: http://www.example.com/word/Are you ok?/,页面输出了这个:

Are you ok

我不知道为什么。但后来我意识到问号符号是 URL 变量的起点。

那么有没有办法对上面示例中的问号进行“url编码”,以便正确显示它?

4

4 回答 4

1

我不知道有关 .htaccess 文件的大量信息,但是您可以将 PHP 脚本更改为使用$_SERVER['PATH_INFO']而不是$_GETor $_REQUEST

特别是,此评论可能会对您有所帮助。

于 2012-12-03T00:15:06.407 回答
1

在 HTTP 协议中,“?” 将查询字符串与 URL 的其余部分分开,因此我认为不可能直接在 URL 中使用它。一种解决方案是将问号编码为%3F.

然后你可以使用string urldecode (string $str)来解码字符串。

有关其他字符的编码,请参阅此URL 编码参考

于 2012-12-03T00:30:23.960 回答
1

不需要编码,试试这个:

RewriteEngine On
RewriteRule ^word/([a-zA-Z0-9-=_.?]+)/?$ displayword.php?word=$1 [L]

它将显示?在参数和您添加到[group]. 不过,我没有测试该规则是否有效,但我想它确实有效。看起来不错,这不是问题。

于 2012-12-03T01:32:49.267 回答
1

将您的代码更改为:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+word/([^/]+) [NC]
RewriteRule ^ index.php?word=%1 [L,QSA]

之所以可行,是因为 RewriteRule 适用于%{REQUEST_URI}获取 URI,即问号之前的字符串,?但也%{THE_REQUEST}适用于包含问号的完整 URL ?

于 2012-12-03T07:38:51.727 回答