多个条件重定向均在单个 .htaccess(着陆页)中

多个条件重定向均在单个 .htaccess(着陆页)中

我有一个文件夹,其中只有“即将推出”的单页 html。

然后,我有几个域,我会根据需要不时地将它们指向这个文件夹。

很简单吧?

我想要的是这样一种情况:如果最初请求的页面是非 www 的,则转到 www (301> 另外,如果不是 https,则转到 https (301),然后将所有流量重定向到https://www.originating-domain.xzy/index.html(302)

目的是让这个着陆页有多种用途,但总是 301 到https://www ,然后 302 到index.html

我已经在每个网站上进行了非 www 到 www 和 http 到 https 的操作:

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]

现在我想将 302 临时重定向添加到index.html

或者有没有更好的方法可以完全做到这一点?因为无论如何这都是暂时的……302 所有流量到索引我试过这个但没有用

RewriteCond %{REQUEST_URI} !.*index\.html
RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]

答案1

RewriteCond %{REQUEST_URI} !.*index\.html
RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]

此处存在几个问题...

  1. 你似乎错过了RewriteRule 图案(第一个参数)完全匹配,所以该指令将无法匹配。

  2. 如果匹配,则会将www.子域名作为前缀再次。我假设你正在放置这个重定向规范重定向(HTTP 到 HTTPS 和非 www 到 www) - 您应该这样做。因此,这将重定向到https://www.www.example.com/index.html,因为在触发此重定向时,主机名已经是规范的。

状况RewriteCond指令)实际上并不是必需的,因为这个检查(/index.html尚未请求)可以由指令本身更有效地处理RewriteRule

例如:

RewriteRule !^index\.html$ /index.html [R=302,L]

无需在中包含方案+主机名代换字符串,因为无论如何你都想重定向到相同的字符串。如果你想要明确,你可以写https://%{HTTP_HOST}/index.html

请注意,就目前情况而言,index.html不能引用任何其他当地的资源(图像、CSS、JavaScript 等),因为这些请求也将被重定向。要允许访问本地资源,您需要添加几个条件来排除对静态资源的请求。

RewriteCond %{REQUEST_URI} !.\.(jpg|png|webp|css|js)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.html$ /index.html [R=302,L]

或者,将这些资源托管在外部域上。(或者在子目录中并排除整个子目录。)

但是,如果选择“重定向”,我可能会重定向到一个更独特/更有意义的命名文件,例如。 ./coming-soon.html使用的问题/index.html是,如果您以后想在该 URL 上提供不同的内容并且它已被缓存(无论出于何种原因)。虽然/coming-soon.html可能应该是“noindex”。

然而,最好不要重定向,而是提供暂时的“503 服务不可用”响应。请参阅我的答案有关此问题的更多信息,请参阅网站管理员堆栈中的以下问题:


在旁边:

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]

您是否位于管理 SSL 连接的前端代理之后?

如果你是,那么没问题,尽管检查HTTPS服务器变量的第二个条件是多余的。但是,如果你是不是X-Forwarded-Proto: https如果在 SSL 代理后面,在请求中注入标头,这些指令很容易被规避(即用户不会被重定向到 HTTPS) 。


更新:

好的,这正如我所愿。但我能以某种方式将它们结合起来吗?

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{REQUEST_URI} !.*coming-soon\.html [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/coming-soon.html [R=302,L]

如上所述,最后一条规则本质上与以下规则相同(与前面的规范重定向结合使用时),更简单、更高效:

RewriteRule !^coming-soon\.html$ /coming-soon.html [R=302,L]

在第二条规则中,你还应该更改RewriteRule 图案^(.*)$^(与第一条规则相同)。^(.*)$不必要地捕获反向引用并且效率较低。

您在之前的评论(现已删除)中提到,您希望它也能适用于任何子域名。它“适用于”任何子域名,但是,它总是会添加一个额外的www子域名,这可能是或可能不是理想的?(通常不会www子域名。YMMV。)

没有必要“合并”这些规则。如果您希望在 302 重定向到“即将推出”页面之前 301 重定向到 www+HTTPS,那么您当然无法合并它们。虽然前两个规则(301 重定向)可以“合并”为单个规则,但它没有任何用处。

这里唯一的小问题是可能 (最多) 有 2 次重定向。首先,原始 URL 路径上的 301 重定向到 www+HTTPS,第二个 302 重定向到“即将推出”页面。

我会质疑,当你将用户重定向到暂时的“即将推出”页面。一旦您实施了新网站(替换“即将推出”页面),您就可以实施规范重定向。302 重定向仍然可以重定向到 www+HTTPS。(但是,当/coming-soon.html直接请求时,存在一种极端情况。)

例如:

# 302 redirect to the coming soon page (www+HTTPS)
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$
RewriteRule !^coming-soon\.html$ https://www.%1/coming-soon.html [R=302,L]

# Edge case...
# The following two rules only apply if "/coming-soon.html" is requested directly
# and either non-www hostname and/or HTTP is requested
# in which case 301 redirect to the same on www+HTTPS

# www subdomain is missing...
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# HTTP + www has been requested
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

任何请求http://example.com/foo都会被 302 重定向到https://www.example.com/coming-soon.html

如果http://example.com/coming-soon.html需要请求则重定向到 301 https://www.example.com/coming-soon.html(仅修复 HTTPS 和 www 子域)。

最多仅有 1 个外部重定向。

答案2

好的,这正如我所愿。但我能以某种方式将它们结合起来吗?

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{REQUEST_URI} !.*coming-soon\.html [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/coming-soon.html [R=302,L]

相关内容