我想做两件事:重定向http://www.example.com
(带有www
)到http://example.com/fr
(不带有www
,和子目录)
当然,我也想http://example.com
重定向到http://example.com/fr
。
我看到了这个解决方案:
RewriteCond %{HTTP_HOST} ^(www\.)?example.com$ [NC]
RewriteCond %{REQUEST_URI} !^/fr/.*$
RewriteRule ^(.*)$ /fr/$1 [L,R=301,NC]
但它会使我的网站速度变得很慢(之后无法加载页面)..我应该修复上述代码中的什么内容?
这是我的完整代码
Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{HTTP_HOST} ^(www\.)?beastof\.com$ [NC]
RewriteCond %{REQUEST_URI} /(.*)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^fr(/|$) /fr/%1 [R=301,L]
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
(这是子目录上的 WordPress 多站点。)
答案1
RewriteCond %{HTTP_HOST} ^(www\.)?example.com$ [NC]
RewriteCond %{REQUEST_URI} !^/fr/.*$
RewriteRule ^(.*)$ /fr/$1 [L,R=301,NC]
这些指令并不是简单地将“重定向http://www.example.com
到http://example.com/fr
”。它们还会重定向http://www.example.com/<anything>
到http://www.example.com/fr/<anything>
。
但它却让我的网站速度变得很慢……
您发布的指令并没有什么特别错误,但是......
我猜想您链接到其他页面/资源时没有使用/fr/
路径段。这会导致每次页面浏览时出现多个外部重定向 - 这可能会降低您网站的速度(尽管这些是 301 重定向,因此应该由浏览器缓存)。
如果是这种情况,那么你要么需要修复内部链接以包含此/fr/
路径段。要么,也许从此重定向中排除静态资源(如果 URL 在没有/fr/
路径段的情况下仍然有效)?
例如,要排除所有静态资源,请修改您的指令,如下所示:
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteCond %{REQUEST_URI} /(.*)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^fr/ /fr/%1 [R=301,L]
这将阻止静态资源(物理文件)被重定向(我不知道这是否仍然有效)。
我还对您的指令进行了轻微优化(但不会导致速度大幅提升)。我已将否定检查/fr/
移至RewriteRule
图案,而不是使用RewriteCond
指令。RewriteRule
图案首先处理,因此如果可以的话最好在这里包含你的第一张支票(否则每一个URL 将被处理)。然后从状况而是(%1
而不是$1
在RewriteRule
代换)。如果没有明确需要,则无需使用NC
( ) 标志。NOCASE
更新#1:
example.com/fr
(末尾没有斜杠),[...] 重定向到example.com/fr/fr
要解决此问题,您可以更改RewriteRule
图案排除完全匹配/fr
或 URL开始 /fr/
, 例如:
RewriteRule !^fr(/|$) /fr/%1 [R=301,L]
这样就可以防止example.com/fr
重定向。(但是,这是一个有效的 URL 吗?您现在有两个 URL:example.com/fr
并且example.com/fr/
可能访问相同的资源?)
这是我的完整代码
: RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] :
由于您已将“完整代码”添加到问题中,我发现您已经有一个“异常”块(上面的 3 个指令),它排除了静态资源被重写 - 只是它在错误的位置,现在您已经添加了上面的附加指令。
您应该将这 3 个指令移动到指令的正下方RewriteBase
(即顶部)。虽然你需要排除文档根目录从此(通过更改^
为!^$
- 参见下文)以允许/
重定向到/fr/
- 因为文档根目录也是一个目录。然后,您可以RewriteCond %{REQUEST_FILENAME} !-f
从上面的块中删除该指令(在这个答案的第一部分)。
更新#2因此,总而言之...
(已更新,在开头包含规范的 www 到非 www 重定向。这使我们能够简化后面检查的条件HTTP_HOST
。)
Options +FollowSymLinks
RewriteEngine on
RewriteBase /
# Canonical www to non-www redirect
RewriteCond %{HTTP_HOST} ^www\.(example\.com)$ [NC]
RewriteRule (.*) http://%1/$1 [R=301,L]
# Exception: Exclude files and directories (except the document root)
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule !^$ - [L]
RewriteRule ^index\.php$ - [L]
# Redirect all requests to /fr/ subdirectory
RewriteCond %{HTTP_HOST} =example.com [NC]
RewriteCond %{REQUEST_URI} /(.*)
RewriteRule !^fr(/|$) /fr/%1 [R=301,L]
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]