这很奇怪,但还没有这样的问题:以下每个重写在单独编码时都是微不足道的;但如何构造正则表达式以将所有这些都包含在一次重写中?
大多数网址都有 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吗?
这就是您如何在单个重定向中完成所有这些工作:
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:请记住,在此更改后,搜索引擎将需要几周的时间来再次索引您的页面。