不同的.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设置的服务器变量。要么是
off
或
on
无论服务于哪个端口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]
对于任一种解决方案,我应该添加
RewriteCond
和
RewriteRule
紧随其后的条目
RewriteBase /
是的,这是一个合乎逻辑的地方。(然而,它可以先于它,甚至先于RewriteEngine
指令-从技术上讲,这无关紧要。)