Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 强制非www和强制https的最兼容/正确方式是什么?_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

Apache 强制非www和强制https的最兼容/正确方式是什么?

Apache 强制非www和强制https的最兼容/正确方式是什么?,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我正在寻找一些帮助,以找到最兼容的、更重要的是强制使用非www.和强制使用https的正确方法 根据Apache强制非www.(这些规则是用于添加www的。因此需要进行微小的调整) 对于在80以外的端口上运行的站点: RewriteCond "%{HTTP_HOST}" "!^www\.example\.com" [NC] RewriteCond "%{HTTP_HOST}" "!^$" RewriteCond "%{SERVER_PORT}" "!^80$" RewriteRule

我正在寻找一些帮助,以找到最兼容的、更重要的是强制使用非
www.
和强制使用https的正确方法

根据Apache强制非
www.
(这些规则是用于添加www的。因此需要进行微小的调整)

对于在80以外的端口上运行的站点:

RewriteCond "%{HTTP_HOST}"   "!^www\.example\.com" [NC]
RewriteCond "%{HTTP_HOST}"   "!^$"
RewriteCond "%{SERVER_PORT}" "!^80$"
RewriteRule "^/?(.*)         "http://www.example.com:%{SERVER_PORT}/$1" [L,R,NE]
对于在端口80上运行的站点

RewriteCond "%{HTTP_HOST}"   "!^www\.example\.com" [NC]
RewriteCond "%{HTTP_HOST}"   "!^$"
RewriteRule "^/?(.*)"        "http://www.example.com/$1" [L,R,NE]
如果您希望对所有域名执行此操作,也就是说,如果您希望将example.com的所有可能值重定向到www.example.com,您可以使用以下方法:

RewriteCond "%{HTTP_HOST}" "!^www\." [NC]
RewriteCond "%{HTTP_HOST}" "!^$"
RewriteRule "^/?(.*)"      "http://www.%{HTTP_HOST}/$1" [L,R,NE]
根据Apache强制使用HTTPS

仅搜索Stackoverflow就有数百个示例,它们都是不同的,都有不同的样式,都有不同的正则表达式规则,都有不同的选项,有些合并了,有些没有合并

例如,下面的一些例子:

RewriteEngine On
RewriteCond %{SERVER_PORT} 80 [OR]
RewriteCond %{HTTP_HOST} ^www.examplewebsite.com
RewriteRule ^(.*)$ https://examplewebsite.com/$1 [L,R=301]

目前我正在使用:

<IfModule mod_rewrite.c>
    # Force HTTPS & NON-WWW
    RewriteEngine On
    RewriteCond %{HTTPS} !=on  [OR]
    RewriteCond %{HTTP_HOST} !^examplewebsite\.com$ [NC]
    RewriteRule ^ https://examplewebsite.com%{REQUEST_URI} [R=301,L]
</IfModule>
<IfModule mod_rewrite.c>
    # Force Removal of WWW
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,QSA,NC,L]
</IfModule>

#强制HTTPS和非WWW
重新启动发动机
重写cond%{HTTPS}=在[或]
重写cond%{HTTP_HOST}^示例网站\.com$[NC]
重写规则^https://examplewebsite.com%{REQUEST_URI}[R=301,L]
可通过以下途径找到:

但我想知道:

  • 如果可以改进,使其更兼容
  • 如果可以使其成为动态的(有没有办法消除定义网站名称的需要?)
  • 是否需要任何额外的标签,如QSA、NE或R是否应为301或空白
我还需要第二条规则来删除子文件夹中.htaccess文件的www

目前我正在使用:

<IfModule mod_rewrite.c>
    # Force HTTPS & NON-WWW
    RewriteEngine On
    RewriteCond %{HTTPS} !=on  [OR]
    RewriteCond %{HTTP_HOST} !^examplewebsite\.com$ [NC]
    RewriteRule ^ https://examplewebsite.com%{REQUEST_URI} [R=301,L]
</IfModule>
<IfModule mod_rewrite.c>
    # Force Removal of WWW
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,QSA,NC,L]
</IfModule>

#强制删除WWW
重新启动发动机
重写条件%{HTTP_HOST}^www\.(.*)$[NC]
重写规则^(.*)$https://%1%{REQUEST_URI}[R=301,QSA,NC,L]
我想这个稍微好一点:

<IfModule mod_rewrite.c>
    # Force Removal of WWW
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteCond %{HTTPS}s ^on(s)|
    RewriteRule ^ http%2://%1%{REQUEST_URI} [L,R=301]
</IfModule>

#强制删除WWW
重新启动发动机
重写cond%{HTTP_HOST}^www\.(.+)$[NC]
在上重写cond%{HTTPS}s^|
重写规则^http%2://%1%{REQUEST_URI}[L,R=301]
这是相当动态的,但像上面一样,有什么改进吗?有更好的规则吗?apache的规则更好吗

<IfModule mod_rewrite.c>
    # Force Removal of WWW
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,QSA,NC,L]
</IfModule>
<IfModule mod_rewrite.c>
    # Force Removal of WWW
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteCond %{HTTPS}s ^on(s)|
    RewriteRule ^ http%2://%1%{REQUEST_URI} [L,R=301]
</IfModule>