【问题标题】:how to redirect http to https plus redirect `index.html` to another html page in .htaccess together?如何将http重定向到https加上将`index.html`重定向到.htaccess中的另一个html页面?
【发布时间】:2020-11-25 06:35:19
【问题描述】:

我在 .htaccess 中有一个将 http 重定向到 https 的代码,但我还想添加一个将 index.html 页面重定向到另一个 html 页面的代码。有没有办法在.htaccess 中同时做到这两点。下面提供的代码。

http 转 https 代码

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

index.html 到另一个 html 页面代码

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule ^$ http://example.com/index.php [L,R=301]

【问题讨论】:

  • 您的 HTTP 到 HTTPS 重定向当前是否正常工作?您是否尝试过上述指令?具体是什么问题? “重定向 index.html 页面” - 但是您实际请求的 URL 是什么?您的指令将重定向对/ 的请求,而不是/index.html
  • 是的,我的 http 到 https 重定向工作正常,但我还想添加在网站加载时重定向到另一个 html 页面的代码。基本问题是 stackoverflow.com/questions/63258322/…>
  • 我不相信外部“重定向”真的是你想要做的。您似乎试图解决的问题是您的应用程序/网站链接到一个 URL,但您想从不同的位置提供该文件? 内部重写 可能更可取,或者只是更改目录索引文档 - 这些都对客户端隐藏。您要重定向的确切 URL是什么?
  • 您发布的代码是从 A 到 B 的重定向 - 那么究竟是什么不工作?

标签: javascript html .htaccess web-hosting


【解决方案1】:

您希望首先执行 http --> https,因为这同时适用于原始和重定向以实现安全通信。

    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
    Header always set Content-Security-Policy "upgrade-insecure-requests;"

现在您可以将重定向应用到index.php

     <IfModule mod_rewrite.c>
     RewriteEngine On
     RewriteBase /
     RewriteRule ^index\.php$ - [L]
     RewriteCond %{REQUEST_FILENAME} -f
     RewriteCond %{REQUEST_FILENAME} -d
     RewriteRule . /index.php [L]
     </IfModule>

您可以调整 -f-d 以包含 ! 和/或更改文件名类型以满足您的特定需求。

【讨论】:

  • %{HTTPS} !=on - 我想知道您为什么将问题中发布的 HTTP 更改为 HTTPS 代码。据我们所知,这已经可以正常工作了。您发布的第二个代码块是前端控制器模式 - 而不是 OP 似乎要求的简单“重定向”?
  • 您提出了一个有效的观点,即 HTTP 到 HTTPS 代码可能已经按设计工作。有点不清楚为什么 OP 在问题中包含这部分代码;它似乎暗示了对相关代码的潜在修改,而不仅仅是一般的 htacess 文件。这可能会使情况进一步复杂化。由于没有提及特定的 CMS,因此我提供了一个可以应用于多种类型网站的版本。
  • 再次使用第二个代码块,我只是尝试提供一个可以根据需要进行修改的设计。但也许我留下了太多的错误空间?顺便说一句,我很喜欢你的帖子。多谢指点,我会尽量具体一点。
  • “不清楚为什么 OP 将那部分代码包含在问题中” - 诚然,关于这个问题有几件事尚不清楚,尽管我相信包含现有指令的意图是了解这些将如何与“新”重定向交互。与现有指令冲突是.htaccess 中错误的常见原因,因此了解现有指令是一件好事,并且通常是解决更复杂问题的必要条件。干杯。
【解决方案2】:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule ^$ http://example.com/index.php [L,R=301]

是的,这是一个外部重定向,从http(s)://example.com/ 重定向到http://example.com/index.php。但是,您正在重定向到 HTTP,而不是 HTTPS,并且您正在重定向到 index.php,而您在问题中声明了 index.html。似乎不需要检查请求的主机名,除非您有多个域并且只想重定向一个实例。

除非您计划实施 HSTS,否则请在您的常规 HTTP 到 HTTPS 重定向之前包含此重定向,并在您的 HTTP 到 HTTPS 重定向中包含规范主机名。

例如:

RewriteEngine On

# Redirect / or /index.html TO /dir/index.html (HTTPS)
RewriteRule ^(index\.html)?$ https://example.com/dir/index.html [R=302,L]

# Redirect HTTP to HTTPS
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://example.com%{REQUEST_URI} [R=302,L]

但是,在阅读了您的linked question 之后,外部“重定向”可能不是解决您问题的正确方法。当您应该链接到子目录中的文件时,听起来您可能“错误地”链接到文档根目录中的文件? (真的,如果是这种情况,您应该更正您的内部链接......)但是,一个可行的解决方案可能是将请求内部重写到所需的 URL 路径或更改 DirectoryIndex如果您要链接到文档根目录。这对用户/客户端完全隐藏 - 用户只能看到 URL A,但您实际上是在提供 URL B。但这取决于您网站的结构。

另一方面,外部重定向将用户/浏览器物理发送到 URL B。他们会看到 URL A(他们点击的链接)和 URL B(他们被重定向到的 URL)——就像搜索引擎机器人。浏览器需要发出两个请求。这对用户来说可能会变慢,并且在您的服务器上放置更多工作(不多,但仍然更多)。

【讨论】:

    猜你喜欢
    • 2021-06-13
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 2016-02-25
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多