htaccess 正则表达式:如何避免多次重定向并仍然满足 2x2x2 无重复 Google 要求

问题描述 投票:0回答:1

这很奇怪,但还没有这样的问题:以下每个重写在单独编码时都是微不足道的;但如何构造正则表达式以将所有这些都包含在一次重写中?

  1. http -> https
  2. www。 ->(无 www 子域)
  3. /index.php -> / (如果 %{REQUEST_URI} 没有 GET 参数等)
  4. (如果 url 指向不带尾部斜杠的目录) -> (添加尾部斜杠)

大多数网址都有 2x2=4 或 2x2x2=8 重复项,这会阻止 Google 索引。

对于 1+2+3,我收到了一个优雅的单重写解决方案 by @MrWhite:

RewriteEngine On
# Redirect HTTP and/or WWW and remove "index.php" (if any)
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC,OR]
RewriteCond %{REQUEST_URI} /index\.php$
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.*?)\.?$ [NC]
RewriteRule ^(.*?)(?:(^|/)index\.php)?$ https://%1/$1$2 [R=301,L]

有人能解1+2+3+4吗?

regex .htaccess
1个回答
0
投票

这就是您如何在单个重定向中完成所有这些工作:

RewriteEngine On

## remove www, trailing slash and turn on https in same external redirect

# turn directory slash off by mod_dir
DirectorySlash off

# for directory URI add a trailing slash and set env variable DSLASH
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !/$
RewriteRule . %{REQUEST_URI}/ [L,E=DSLASH:1]

# redirect if DSLASH is set or www is present or https is missing
RewriteCond %{ENV:REDIRECT_DSLASH} =1 [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC,OR]
RewriteCond %{HTTPS} !on
RewriteCond %{HTTP_HOST} ^(?:www\.)?([^:]+) [NC]
RewriteRule ^(.+/)?(?:index\.php)?$ https://%1/$1 [R=302,L,NC,NE]

一旦确认其工作正常,请将

R=302
替换为
R=301
。在测试您的
R=301
规则时,避免使用
mod_rewrite
(永久重定向)。

PS:请记住,在此更改后,搜索引擎将需要几周的时间来再次索引您的页面。

© www.soinside.com 2019 - 2024. All rights reserved.