RewriteRule阻止编码

时间:2017-11-03 23:40:42

标签: php jquery .htaccess mod-rewrite encoding

在我的htaccess中,我为我的搜索页面重写规则以创建干净的URL;

原始网址:

http://www.example.com/index.php?keyword=apple

RewriteRule:

RewriteRule ^keyword/([A-Za-z0-9-]+)/?$ index.php?keyword=$1 

清理网址:

http://www.example.com/keyword/apple

除非我输入外国字符,否则完美无缺。例如,如果我写

http://www.example.com/keyword/değişmek

我得到404.这是有道理的,因为字母ğ和ş是外国字母。它们必须被编码。但是,如果我在原始网址中写下该关键字,

http://www.example.com/index.php?keyword=değişmek

有效。我得到了结果。此外,我尝试编码用户输入搜索干净URL

的内容
var url = encodeURIComponent($("#search-input").val());
window.location.href = "http://www.example.com/keyword/"+ url ; 
console.log(url);

没用。我得到404.我检查了console.log,用户输入被编码。因此,我认为rewriterule会导致编码问题。所以我试图添加一些与编码相关的标志。

RewriteRule ^keyword/([A-Za-z0-9-]+)/?$ index.php?keyword=$1 [NE]
RewriteRule ^keyword/([A-Za-z0-9-]+)/?$ index.php?keyword=$1 [B]
RewriteRule ^keyword/([A-Za-z0-9-]+)/?$ index.php?keyword=$1 [NE,B]

没用。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

它不起作用,因为您只使用alphanumeric characters定义 ([A-Za-z0-9-]+)

尝试使用([^/]+)代替如果你想允许所有内容

或使用([\p{L}0-9]+)仅允许使用unicode字母和数字

但它不允许像%&*()#!@

这样的特殊标记