如何在 .htaccess 文件中使用 [OR] 或替换?

如何在 .htaccess 文件中使用 [OR] 或替换?

概括[OR]标志在不同服务器上的工作方式不一致。详细信息和问题如下。

我有一个在 GoDaddy 上托管的网站,我为一个.htaccess文件编写了此代码,用于将用户重定向到https我的网站版本。效果很好。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off [OR]
    RewriteCond %{HTTP_HOST} !^www\. [NC]   
    RewriteRule ^(.*)$ https://www\.firstsite\.com%{REQUEST_URI} [R=301,L]
</IfModule>

我将同一个.htaccess文件用于 Network Solutions 上托管的另一个网站,结果导致该网站崩溃。产生了此错误。

此页面无法运行
www.secondsite.com 将您重定向过多次。
错误信息

我删除了[OR]网络解决方案站点的标志,站点加载时没有出现错误。这是更新后的代码。

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ https://www\.secondsite\.com%{REQUEST_URI} [R=301,L]
</IfModule>

不幸的是,如果没有,[OR]它不会根据第一个条件重定向RewriteCond %{HTTPS} off。但是它仍然会根据第二个条件重定向RewriteCond %{HTTP_HOST} !^www\. [NC]

我不知道该如何解决这个问题。我需要,[OR]但我不能使用它。有没有[OR]其他方法可以使用,或者有其他替代方法可以解决这种情况?非常感谢!

答案1

[OR]标志在不同的服务器上不能一致地起作用。

这(几乎)是不可能的。该OR标志是 mod_rewrite 中的一个基本构造/操作符。如果此构造无法正常工作,则说明您的服务器存在严重问题,需要重新安装或寻找新主机。这种情况极不可能发生。

但是,更有可能的是,OR 表达式中的一个操作数不符合您的预期。即,在这种情况下,服务器变量之一HTTPSHTTP_HOST未按预期设置。在这两种情况下,更有可能的是HTTPS服务器变量未设置(或未按预期设置) - 正如我在评论中提到的那样。这很“正常”,取决于您的服务器配置以及 SSL 证书的管理方式。例如,如果您的 SSL 证书由前端代理(如 CloudFlare)管理,则服务器变量HTTPS可能未设置。这似乎与您看到的结果一致。

调试

以下提示只是为了帮助进行初步调试以便找到最终的解决方案。

注意:测试时,最好使用临时(302)重定向,因为浏览器不会缓存这些重定向。301(永久)重定向会被浏览器硬性缓存,因此您必须确保禁用缓存,否则测试会很麻烦。请确保清除缓存后再继续。

  1. 尝试(暂时)将其更改为 HTTP 到 HTTPS(仅)重定向,即删除 www 规范化。您仍然遇到重定向循环吗?例如:

    RewriteCond %{HTTPS} off
    RewriteRule ^ https://www.example.com%{REQUEST_URI} [R,L]
    

    在旁边:无需在RewriteRule 代换- 这是一个普通字符串,而不是正则表达式。)

  2. 如果上述操作触发了重定向循环,则检查服务器变量HTTPS包含的内容。即删除上述 HTTP 到 HTTPS 重定向并添加以下内容:

    RewriteRule ^foo$ /?HTTPS=%{HTTPS} [R,L]
    

    并直接访问 URL https://example.com/foo。您应该被重定向到https://example.com/?HTTPS=<value>。是什么<value>?(<value>可能为空。)

  3. 检查 HTTP 请求标头应用正在看到。如果您使用的是 PHP,请检查$_SERVER$_ENV超全局数组,并特别检查索引HTTPSSERVER_PORTSCRIPT_URIHTTP_X_FORWARDED_PROTO对应于X-Forwarded-Proto标头 - 如果已设置)。但是,可能还有其他特定于您的服务器的索引。例如,某些主机设置了环境变量称为HTTPS(而不是同名的服务器变量)。将您找到的内容添加到您的问题中。

    如果你看到X-Forwarded-Proto请求标头,则说明你位于前端代理后面,例如StackOverflow 上的这个问题

也可以看看Pro Webmasters 上的这个问题进行类似的“讨论”并最终找到解决方案。


更新:... 托管于网络解决方案...

我刚刚对“网络解决方案”(NS)进行了一些研究,似乎这可能不是可能的!? 如果这是真的,我会觉得非常震惊,但是我认为这仍然取决于如何安装以及安装哪种类型的 SSL 证书?

(仍然检查上面提到的 HTTP 请求标头和服务器/脚本变量。)

但是,那Network Solutions 关于 SSL 重定向的支持文档状态:

Network Solutions® 使用代理 SSL,因此不允许使用服务器端变量来检测 HTTPS(安全)。所有服务器端编码将始终检测 HTTP(非安全),对于尝试将非安全连接 ( http://) 重定向到安全连接 ( https://) 的程序,将在 30 秒后导致无限循环和服务器错误。

您可以使用客户端程序(如 javascript)来检测它是否安全,如果不安全则重定向。您可以使用以下代码来创建重定向。只需修改代码,使其重定向到正确的安全域,并将其添加到您可能拥有的任何敏感页面的 HTML 中。

<script language="javascript">
if (document.location.protocol != "https:")
{
document.location.href = "https://subdomain.yourdomain.com" + 
document.location.pathname;
};
</script>

“代理 SSL” 应该标识自身,或者至少在向应用服务器发送的“代理”请求中标识 HTTPS 状态。然而,这意味着它没有标识。

另请参阅 StackOverflow 上的以下相关问题。但是,在我看来,那里提出的“其他”解决方案似乎不可行。最终结论似乎是对 NS 的上述支持文档(和 JavaScript 解决方案)的引用。
https://stackoverflow.com/questions/4686668/https-redirect-for-network-solutions

答案2

这是使用 Networksolutions 重定向的唯一干净方法。我花了几个小时进行测试。最适合 SEO。Network Solutions 是一个具有挑战性的托管平台。

这个 .htaccess 可以工作,您需要做的就是将其替换changeexample.com为您的域名。很简单。

## Base Redirects ##

# Turn on Rewrite Engine
RewriteEngine On

# Remove trailing slash from non-filepath urls
RewriteCond %{REQUEST_URI} /(.+)/$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ https://changeexample.com/%1 [R=301,L]

# Include trailing slash on directory 
RewriteCond %{REQUEST_URI} !(.+)/$
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+)$ https://changeexample.com/$1/ [R=301,L]

# Force HTTPS and remove WWW
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [OR,NC]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://changeexample.com/$1 [R=301,L]

相关内容