.htAccess 301与实施HTTPS的302

时间:2017-10-06 作者:Jacob Quisenberry

对于WordPress,我看到了两种不同的编辑技术。用于路由到HTTPS的htaccess文件。这些方法的优缺点是什么:

Option #1

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
导航到www.example时。com,此解决方案返回状态302并将流量路由到https://www.example.com

看见here.

Option #2

# Force HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
我相信此解决方案将返回状态301。我没有测试,因为选项#1似乎有效。

看见here.

这是我的相关模块。应用任何一种方法之前,请访问htaccess文件。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTPS} =on
    RewriteRule .* - [E=W3TC_SSL:_ssl]
    RewriteCond %{SERVER_PORT} =443
    RewriteRule .* - [E=W3TC_SSL:_ssl]
    RewriteCond %{HTTP:Accept-Encoding} gzip
    RewriteRule .* - [E=W3TC_ENC:_gzip]
    RewriteCond %{HTTP_COOKIE} w3tc_preview [NC]
    RewriteRule .* - [E=W3TC_PREVIEW:_preview]
    RewriteCond %{REQUEST_METHOD} !=POST
    RewriteCond %{QUERY_STRING} =""
    RewriteCond %{REQUEST_URI} \\/$
    RewriteCond %{HTTP_COOKIE} !(comment_author|wp\\-postpass|w3tc_logged_out|wordpress_logged_in|wptouch_switch_toggle) [NC]
    RewriteCond "%{DOCUMENT_ROOT}/wp-content/cache/page_enhanced/%{HTTP_HOST}/%{REQUEST_URI}/_index%{ENV:W3TC_SSL}%{ENV:W3TC_PREVIEW}.html%{ENV:W3TC_ENC}" -f
    RewriteRule .* "/wp-content/cache/page_enhanced/%{HTTP_HOST}/%{REQUEST_URI}/_index%{ENV:W3TC_SSL}%{ENV:W3TC_PREVIEW}.html%{ENV:W3TC_ENC}" [L]
</IfModule>
对于任何一种解决方案,我应该添加RewriteCondRewriteRule 紧随其后的条目RewriteBase / ?

1 个回复
最合适的回答,由SO网友:MrWhite 整理而成

不同的.htaccess/您看到的mod\\u重写指令通常是由于服务器配置(与WordPress无关)和使用位置的不同。世上没有“一刀切”的东西。(例如,如果您在SSL代理之后,上述重定向可能无法工作。)然而,与大多数事情一样,做同一件事通常有不同的方式。所以,你不需要用一种特定的方式来实现它的完美工作。

Option#1

RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
默认情况下,HTTP在端口80上工作,这是它检查的对象。但是,您可以将HTTP配置为在不同的端口上工作。在这种情况下,这将失败。

如您所述,这是一个302(临时)重定向。(当您没有将状态代码显式包含在R 标志。)除非您正在测试,否则HTTP到HTTPS重定向应该是永久性的。所以,你通常会认为这是一个301,即。R=301. 301重定向由浏览器缓存,并被搜索引擎视为永久性更改。

^(.*)$ - 严格地说,开始和结束锚,即。^$, 完全是多余的。^(.*)$ 与相同(.*). 然而,一些用户发现前者更容易阅读。你喜欢什么都行。这只需获取整个URL路径并将其保存在$1 反向引用,稍后在替换中使用。

https://www.example.com/$1 - 在替换中硬编码规范主机名可以说更可靠。当将此代码传递给某人在其站点上使用时,出错的可能性较小。服务器管理员经常争辩说,这是您应该始终这样做的方式(尽管我不一定同意-我不是服务器管理员)。(特别是如果您有多个域,并且www与非www主机名存在差异。)然而,硬编码是。。。好硬编码。因此,它的便携性较差。

本指令仅适用于.htaccess (或目录上下文)。如果您直接在服务器配置中使用此选项(不是这样),您将得到一个双斜杠(//) 在重定向的URL中。

Option#2

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
HTTPS 是Apache设置的服务器变量。要么是offon 无论服务于哪个端口HTTP(和/或HTTPS),它都可以工作。它也可以说比检查更容易阅读SERVER_PORT. 然而HTTPS 在Apache 1.3上不可用(尽管这真的不应该是个问题!)。在大多数服务器上,检查%{SERVER_PORT} 80%{HTTPS} off.

R=301 - 很好,这是301(永久)重定向。这通常是你想要的。

(.*) - 无不必要的锚(见上文)。然而$1 在替换中未使用反向引用(%{REQUEST_URI} ,因此括号是不必要的(较小的)开销,应该删除。这应该写下来.*, 或者只是^.

https://%{HTTP_HOST}%{REQUEST_URI} - 这个HTTP_HOST 服务器变量保存请求中存在的主机名。如果您的站点可以通过多个域访问,那么这将保留所请求的任何域。如果您的SSL证书只覆盖其中一个域,那么这将中断。这也不会规范化www与非www之间的任何差异,这需要在本指令之前进行,以避免潜在的双重重定向(这就是为什么您经常看到www和HTTPS重定向一起进行的原因)。

因为使用%{REQUEST_URI} 在替换中,此规则可用于服务器配置或.htaccess 未经修改的文件。

Option#3

RewriteCond %{HTTPS} off
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L]
对于任一种解决方案,我应该添加RewriteCondRewriteRule 紧随其后的条目RewriteBase /

是的,这是一个合乎逻辑的地方。(然而,它可以先于它,甚至先于RewriteEngine 指令-从技术上讲,这无关紧要。)

结束

相关推荐

有关.htaccess和wp-login.php预防的问题

我注意到一个“错误”。我在教程中读到的htaccess规则。我试图做的是阻止访问wp登录。php使用非常常见。htaccess规则如下:<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_URI} ^(.*)?wp-login\\.php(.*)$ [OR] RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$ RewriteCond %{REMOTE_A