如何在.htaccess中从用户输入的多个地址重定向到一个终端地址?
例如,结束地址是如何在.htaccess中从用户输入的多个地址重定向到一个终端地址?,.htaccess,redirect,.htaccess,Redirect,例如,结束地址是https://www.example.com 当用户输入此类地址变体时: example.com example.com/index.php http://www.example.com http://www.example.com/index.php www.example.com www.example.com/index.php https://example.com https://example.com/index.php 所有这些地址中必须有一个301重定向到h
https://www.example.com
当用户输入此类地址变体时:
example.com
example.com/index.php
http://www.example.com
http://www.example.com/index.php
www.example.com
www.example.com/index.php
https://example.com
https://example.com/index.php
https://www.example.com
,不是几个连续的:
->example.com
https://www.example.com
->example.com/index.php
https://www.example.com
->http://www.example.com
https://www.example.com
等等。您的几个URL示例实际上代表同一个URL。例如,
http://www.example.com
和www.example.com
(浏览器默认为HTTP)
尽管列出了许多“不同”的URL,但您只需要满足3个标准:
- 从URL路径的开头删除
index.php
- 将非www重定向到www
- 将HTTP重定向到HTTPS
- 您希望保留任何URL路径(和查询字符串)
- SSL证书直接安装在您的应用程序服务器上,您没有使用SSL代理。这决定了如何检查请求是否已经是HTTPS
.htaccess
文件顶部尝试以下操作:
RewriteEngine On
# Remove "index.php"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index\.php$ https://www.example.com/ [R=301,L]
# non-www to www
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L]
# HTTP to HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L]
您应该首先使用302(临时)重定向进行测试,以避免潜在的缓存问题,因为默认情况下浏览器会持久缓存301s
检查REDIRECT\u STATUS
环境变量的条件可能是必要的,也可能不是必要的,这取决于您是否通过前端控制器路由所有请求(即内部重写到index.php
)——这是一种常见的设计模式
如果我们知道您只有一个域而没有子域,那么非www到www重定向可以说是“简化”的。也就是说,我们可以不检查www(!^www.
),而直接检查域顶点(^example\.com
)
单规则/1重定向
如果您愿意,可以将这些规则简化为一个规则(仍然只有一个重定向),但这样做并没有真正的好处(事实上,可能更难阅读):
单个“通用”规则/1重定向
如果只有一个域而没有子域,则可以实现一个完全通用的版本,例如:
# Canonicalise "index.php" / HTTPS / www - Generic version
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} ^(www\.)?(.+?)\.?$
RewriteRule ^(?:index\.php|(.*))$ https://www.%1/$1 [R=301,L]
但这并不一定比我上面发布的第一个版本“更好”,而且可能更容易出错。虽然它确实展示了使用mod_rewrite和regex的一些有用的原则。URL路径呢?是否要保留URL路径(除了
index.php
)?在您发布的示例中,根本没有URL路径(除了要丢弃的index.php
),您正在将所有内容重定向到文档根目录?您是否有指向同一托管帐户的其他域?还是只有example.com
?
# Canonicalise "index.php" / HTTPS / www - Generic version
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} ^(www\.)?(.+?)\.?$
RewriteRule ^(?:index\.php|(.*))$ https://www.%1/$1 [R=301,L]