Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在.htaccess中从用户输入的多个地址重定向到一个终端地址?_.htaccess_Redirect - Fatal编程技术网

如何在.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
所有这些地址中必须有一个301重定向到
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

单独规则/1重定向 如果重定向到同一个规范方案+主机名,则不必将其简化为一个规则-最多仍将有一个重定向

使用mod_rewrite在根
.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]