考虑以下情况:
我希望能够访问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'问号,以便正确显示?
答案 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}
适用于包含问号?
的完整网址好。