我有基于 Grav CMS 的多语言网站和两个域名:
grav-site.pl
和grav-site.com
我想重定向:
grav-site.pl/en
->grav-site.com
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]