【发布时间】:2017-06-16 02:33:28
【问题描述】:
也就是说,我有这个 .htaccess 命令...
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([^\x00-\x7F]+).*$ ?open=encyclopedia&letter=$1&term=$0 [R,B,L,QSA]
RewriteRule ^([A-Z](?:[^\x00-\x7F]+|[A-Z])?).*$ ?open=encyclopedia&letter=$1&term=$0 [R,B,L,QSA]
...我现在有两个问题:
问题 1 - 它加载 all 字母 except 的简写> A、S 和 O。它显示空白页面而不是实际页面。
问题 2 - 当我输入 http://example.com/Šandi (Astronomy) 时,而不是通常将我重定向到 http://example.com/?open=encyclopedia&letter=Š&term=Šandi+(Astronomy),URL 是 http://example.com/?open=encyclopedia&letter=%25c5%25a0&term=%25c5%25a0andi+%2528Astronomy%2529
换句话说:
• 当我从任一规则中删除 [R] 标志时,速记 URL (id est - example.com/A-O-S) 如 问题 1 中所述。
• 当我添加[R] 标志时,它会不恰当地重定向,如问题 2 中所述,并且它不显示页面。
注意:这些问题包括英文和非英文字母(Š/Đ/ Č/Ć/Ž)。
正如@anubhava 建议的那样:<?php print_r($_GET); ?> 带有[R] 标志:
英文:Array ( [open] => encyclopedia [letter] => V [term] => Vodolija (Astrologija) )
网址:?open=encyclopedia&letterV&term=Vodolija (Astrologija)
非英语:数组 ( [open] => encyclopedia [letter] => ? [term] => Škorpija (Astrologija) )
网址:?open=encyclopedia&letter=%c5&term=%c5%a0korpija%20(Astrologija)<?php print_r($_GET); ?> 没有 [R] 标志:
英文:Array ( [open] => encyclopedia [letter] => V [term] => Vodolija (Astrologija) )
网址:/Vodolija (Astrologija)
非英语:Array ( [open] => encyclopedia [letter] => Š [term] => Škorpija (Astrologija) )
网址:/Škorpija (Astrologija)
至于索引页面:
A - 数组( [open] => encyclopedia [letter] => A [term] => A ):不显示页面,显示空白页。
O - 数组 ( [open] => encyclopedia [letter] => O [term] => O ):不显示页面,显示空白页。
S - 数组([open] => encyclopedia [letter] => S [term] => S):不显示页面,显示空白页。
至于所有其他索引页面,URL 是数组( [open] => encyclopedia [letter] => AnyLetter [term] => SameAnyLetter):它正确显示页面............我没有看到逻辑它。
这是新代码:
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
#1 RewriteRule ([A-Z](?:[^\x00-\xFF].|\w).*) ?open=encyclopedia&letter=$2 [R,B,NE,L,QSA] # it loads DZH, but not the rest
#2 RewriteRule (([\x00-\xFF].|\w).*) ?open=encyclopedia&letter=$2 [R,B,NE,L,QSA] # it loads A-O-S and it loads DJ-ZH-LJ-NJ-SH
RewriteRule ^([A-Z](?:[^\x00-\x7F]+|[A-Z])?).*$ ?open=encyclopedia&letter=$1&term=$0 [B,NE,L,QSA]
当我删除第 1 行时,第 2 行工作正常。当我删除第 2 行时,第 1 行工作正常。但他们不会一起工作。
第 2 行显示除 DŽ 之外的所有字母,并正确重定向。
第 1 行仅正确显示字母 DŽ,不会重定向,也不会加载其余部分。
启用第 2 行后,带有 /DŽ 的 URL 将重定向到 /?open=encyclopedia&letter=D%c5
更新 #6:
使用以下代码...
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ((LJ).*) ?open=encyclopedia&letter=$2&term=$1 [R,NE,L,QSA]
RewriteRule ((NJ).*) ?open=encyclopedia&letter=$2&term=$1 [R,NE,L,QSA]
RewriteRule ((D\xC5\xBD).*) ?open=encyclopedia&letter=$2&term=$1 [R,NE,L,QSA]
RewriteRule (([\x00-\xFF].|\w).*) ?open=encyclopedia&letter=$2&term=$1 [R,NE,L,QSA]
...发生这种情况:
• 索引页:对于“双字母”字母,它可以正确打开每个字母。对于单个字母,它会加载除 A、O 和 S 之外的所有字母。
• TERM 页面:考虑到它不会打开 A、O 和 S,因此它不会打开它们的条款页面。
• /Lav (Astrologija) 不会重定向到/?open=encyclopedia&letter=L&term=Lav (Astrologija),而是重定向到/?open=encyclopedia&letter=L&term=Lav+%2528Astrologija%2529,因此不会打开正确的页面。
• 正确打开/Š 并将/Škorpija (Astrologija) 正确重定向到/?open=encyclopedia&letter=Š&term=Škorpija (Astrologija)
• 正确打开/Đ 并将/Đavo 正确重定向到/?open=encyclopedia&letter=Đ&term=Đavo
• 虽然/U 可以正常打开,但/Unuk Al Haj 会重定向到/?open=encyclopedia&letter=Un&term=Unuk%20Al%20Haj,而不是打开正确的页面。
• 虽然/U 可以正常打开,但/Ugaoni Razmak 会重定向到/?open=encyclopedia&letter=Ug&term=Unuk%20Al%20Haj,而不是打开正确的页面。
• 虽然/R 可以正常打开,但/Ribe (Astrologija) 会重定向到/?open=encyclopedia&letter=Ri&term=Ribe (Astrologija),而不是打开正确的页面。
• 虽然/V 可以正常打开,但/Vaga (Astrologija) 会重定向到/?open=encyclopedia&letter=Va&term=Vaga (Astrologija),而不是打开正确的页面。
• 尽管/U 正确打开,/Umerenost 重定向到/?open=encyclopedia&letter=Um&term=Umerenost,而不是打开正确的页面。
• 虽然/K 可以正常打开,但/Kuće (Astrologija) 会重定向到/?open=encyclopedia&letter=Ku&term=Kuće (Astrologija),而不是打开正确的页面。
【问题讨论】:
-
您使用 ASCII 范围虽然似乎获得了多字节 UTF-8,所以在捕获的子掩码中,这些符号可能会被破坏。
-
为什么你现在的规则中有
R标志?拥有R将执行完全重定向并将您的内部 URL 公开给客户端。还要澄清this answer of mine 在哪些方面不适合您? -
@anubhava 是的,我希望它与
Redirect 以及快捷方式一起正常工作,这就是我添加的内容。可悲的是,当我第一次使用您的代码时,我没有完全测试它。正如我在上面详细解释的那样,它显示错误。我更新了我的问题。 -
但是使用
R会将您的内部 URL 暴露给客户,这对您的 SEO 也不利。你为什么要这么做? -
问题一团糟,您只是在展示代码,但并未解释您真正想要完成的工作。
标签: .htaccess mod-rewrite