自动重定向到子目录并删除 www

自动重定向到子目录并删除 www

我想做两件事:重定向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.comhttp://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而不是$1RewriteRule 代换)。如果没有明确需要,则无需使用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]

相关内容