.HTACCESS Unicode识别/编码

3

我在使用.htaccess中的URL缩写时遇到了问题。

具体来说,这个(现在旧的)代码可以正常工作...

# URL ShortCut Maker.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} .(.+)$
RewriteRule ^(.) ?open=encyclopedia&letter=$1&term=%1 [B,L,NC]

它正确地显示URL为example.com/Modesty(它显示页面,就像URL是/?open=encyclopedia&letter=m&term=modesty),但是当我输入以下内容时出现问题: example.com/Šanti,或
example.com/Đin,或
example.com/Žal
example.com/Čakra,或
example.com/Ćof...
...如果我输入任何这些URL,则会显示页面,就好像我输入:
?open=encyclopedia而不是
?open=encyclopedia&letter=Š&term=Šanti 编辑:问题中包含非英文字母。 有什么解决办法吗?

example.com/Šanti 的期望重写是什么? - anubhava
为什么不直接使用%1并使用mb_substr提取第一个字母呢? - Peter
我对我的问题进行了更多的澄清......我不知道还有什么其他的解释方式。@anubhava:example.com/Šanti应该重定向并打开?open=encyclopedia&letter=Š&term=Šanti。这适用于所有其他的ĐČĆŽ字母。它是双重编码和缩短的。@Peter:你是什么意思? - user6494366
1个回答

1
您可以使用以下规则更改现有规则:

RewriteEngine On

RewriteBase /

# executes repeatedly as long as there are more than 1 spaces in URI
RewriteRule "^(\S*)\s+(\S* .*)$" $1+$2 [N,NE]

# executes when there is exactly 1 space in URI
RewriteRule "^(\S*)\s(\S*)$" $1+$2 [L,R=302,NE]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule ^([A-Z](?:[^\x00-\x7F]+|[A-Z])?).*$ ?open=encyclopedia&letter=$1&term=$0 [B,L,QSA]

RewriteRule ^([^\x00-\x7F]+).*$ ?open=encyclopedia&letter=$1&term=$0 [B,L,QSA]

否定字符类[^\x00-\x7F]匹配ASCII范围之外的任何字符。

所以第一种情况,即example.com/Šazdini是正确的吗? - anubhava
好的,现在尝试使用我更新过的规则。请确保这些规则位于您的 .htaccess 文件顶部。 - anubhava
抱歉,我现在无法理解任何内容。请求您编辑问题并澄清每个案例。 - anubhava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接