针对特定语言域的 htaccess 重定向/重写规则

针对特定语言域的 htaccess 重定向/重写规则

我有基于 Grav CMS 的多语言网站和两个域名: grav-site.plgrav-site.com

我想重定向:

  1. grav-site.pl/en->grav-site.com
  2. grav-site.com/pl->grav-site.pl

在 grav knolage 库中我发现解决方案这应该可行所以我将它添加到我的.htaccess

## Begin - Multilanguage Setup
RewriteRule ^en/?$ "http://grav-site.com" [R=301,L]
RewriteRule ^pl/?$ "http://grav-site.pl" [R=301,L]

# handle sub pages, exclude admin path
RewriteCond %{REQUEST_URI} !(admin) [NC]
RewriteRule ^en/(.*)$ "http://grav-site.com/$1" [R=301,L]
RewriteCond %{REQUEST_URI} !(admin) [NC]
RewriteRule ^pl/(.*)$ "http://grav-site.pl/$1" [R=301,L]
# End - Multilanguage Setup

但当我去时http://grav-site.com/pl什么也没有发生(没有重定向)并且 CMS 引擎删除/pl

如何更改 .htaccess 条目以实现正确的重定向?

PS .htaccess 的其余部分https://github.com/getgrav/grav/blob/develop/webserver-configs/htaccess.txt

答案1

<IfModule mod_rewrite.c>...</IfModule>在文件末尾添加了来自上述帖子的条目

这似乎是导致您出现问题的主要原因。这些指令(重定向)需要放在文件开头附近,在您现有的重写之前 - 否则,它们将永远不会被处理。

“前端控制器”(位于以 开头的文件中间## Begin - Index)捕获所有请求并将它们路由通过index.php(您的“前端控制器”),任何遵循此请求的 mod_rewrite 指令都不太可能得到处理,除非该请求针对的是物理文件。

作为基本规则,外部重定向应该总是先于内部重写

出于同样的原因,我会质疑您的“安全”指令的位置(在以 开头的块中## Begin - Security),它也位于您的前端控制器之后。这实际上可能没问题 - 因为它们只会对存在的文件进行处理。但是,同样作为一般规则,阻止/安全指令通常会位于文件顶部附近(甚至在重定向之前)。

答案2

取消注释 .htaccess 文件中的 RewriteBase 行,该行https://github.com/getgrav/grav/blob/develop/webserver-configs/htaccess.txt

如何将“www.example1.com”重定向到“www.example2.com”

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.example1.com [NC]
RewriteRule ^(.*) http://www.example2.com/$1 [L,R=301]

从“www.example.com”重定向到“example.com”,反之亦然

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

反之亦然

RewriteEngine On 
RewriteBase / 
RewriteCond %{HTTP_HOST} ^example.com [NC] 
RewriteRule ^(.*) http://www.example.com/$1 [L,R=301]

从所有不存在的子域名重定向到网站:

RewriteEngine On 
RewriteBase / 
RewriteCond %{HTTP_HOST} ^(.*).example.com [NC] 
RewriteRule ^(.*)$ http://example.com/$1 [L,R=permanent]

将所有网站请求重定向到特定网页:

RewriteEngine On 
RewriteBase / 
RewriteRule ^(.*)$ http://example.com/desired_page/ [L,R=permanent]

相关内容