【问题标题】:.HTACCESS Redirection Issues.HTACCESS 重定向问题
【发布时间】: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


【解决方案1】:

使用 NE(无转义)标志:

# here are all 2 letters which we count as 1

RewriteRule ((D\xC5\xBD).*) ?open=encyclopedia&letter=$2&term=$1 [R,NE,L,QSA] # C5 BD is utf8 encoding of Ž
RewriteRule ((LJ).*) ?open=encyclopedia&letter=$2&term=$1 [R,NE,L,QSA]
RewriteRule ((NJ).*) ?open=encyclopedia&letter=$2&term=$1 [R,NE,L,QSA]

# one letter
RewriteRule (([\x80-\xFF].|\w).*) ?open=encyclopedia&letter=$2&term=$1 [R,NE,L,QSA]

【讨论】:

  • 不,很遗憾,它不起作用。当我添加NE 时没有任何反应,它不会重定向。
  • 更新了答案。
  • 经过大量调整和测试,我发现您的代码可以正常工作。因此,一切正常,除了字母 DŽ(它一直打开字母 D,而不是 DŽ 的索引页)。我用调整后的代码更新了我的问题。想看就看吧。
  • DŽ 是两个字母...您可以为这两个字母创建规则。
  • 我们有 3 组 2 个字母,我们算作 1,例如 DŽ、LJ、NJ。如何创建规则?
【解决方案2】:

在我看来你应该可以使用:

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

RewriteRule ^(.)[^/]*$ ?open=encyclopedia&letter=$1&term=$0 [L,QSA]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多