也许在htaccess中编码URL?

时间:2012-12-03 00:04:17

标签: php .htaccess get

考虑以下情况:

我希望能够访问http://www.example.com/word/hello/,其中hello这个词是可变的。所以我设置了.htaccess来配置它。

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

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

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

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

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

Are you ok

我无法弄清楚原因。但后来我意识到问号符号是URL变量的起点。

在上面的示例中,有没有办法'url encode'问号,以便正确显示?

4 个答案:

答案 0 :(得分:1)

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

特别是this comment可能会帮助你。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

无需编码,请尝试:

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

它会在参数中显示?以及您添加到[group]的任何其他字符。我没有测试规则是否有效,但我认为确实如此。看起来不错,这不是问题。

答案 3 :(得分:1)

将您的代码更改为:

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

这有效的原因是因为RewriteRule适用于%{REQUEST_URI},它在问号?之前获取URI即字符串,但%{THE_REQUEST}适用于包含问号?的完整网址好。