htaccess语言特定域的redirect/重写规则

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

我想redirect

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

在grav的基础上,我发现解决scheme应该工作,所以我把这个添加到我的.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 nothings happend(没有redirect)和CMS引擎删除/pl

如何更改.htaccess条目以实现适当的redirect?

PSrest的.htaccess https://github.com/getgrav/grav/blob/develop/webserver-configs/htaccess.txt

我在<IfModule mod_rewrite.c>...</IfModule>之后添加来自上面的条目,只是在文件结尾

这似乎是你的问题的主要原因。 这些指令(redirect)需要在文件的开头附近,在你现有的重写之前 – 否则,它们将不会被处理。

“前端控制器”(在## Begin - Index开始的文件中间)捕获所有的请求,并通过index.php (你的“前端控制器”)发送它们,任何遵循这个指令的mod_rewrite指令都不可能被处理,除非请求是针对物理文件的。

一般来说, 外部redirect应该总是在内部重写之前进行。

出于同样的原因,我会质疑你的“安全”指令的位置(在开始## Begin - Security ),这也跟随你的前端控制器。 这实际上可能是正确的 – 因为他们只处理存在的文件。 然而,作为一般规则,阻塞/安全指令通常会靠近文件的顶部(甚至在redirect之前)。

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

如何将“www.example1.com”redirect到“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”redirect到“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] 

将所有不存在的子域redirect到网站:

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

将所有的网站请求redirect到特定的网页:

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