问题描述
我在服务器上的同一目录中托管了多个域,每个域都重定向到各自的子目录。我还将所有域重定向到 HTTPS 并通过 .htaccess
文件删除 WWW。一切都按原样工作,但代码感觉很笨重,我相信它可以简化。任何有关如何执行此操作、如何删除任何多余内容的提示,我们将不胜感激。
在我看来,我应该能够通用地处理 HTTPS 和非 WWW 部分,然后只需要对域到子目录部分进行个性化处理。请注意,我还将一个域的变体(.com 和 .net 重定向到 .org 地址),但我认为那里不会发生任何简化。
这里有足够的代码来说明我繁忙的小 .htaccess
文件中发生的一切:
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{SERVER_PORT} 80
# Canonical HTTPS/non-WWW
<IfModule mod_rewrite.c>
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
RewriteCond %{HTTP_HOST} ^www\.domainone\.org [NC]
RewriteRule (.*) https://domainone.org/$1 [L,R=301]
RewriteCond %{HTTP_HOST} ^(ww+\.)?domainone\.org
RewriteCond %{REQUEST_URI} !/domainone-org/
RewriteRule ^(.*)$ /domainone-org/$1 [L]
RewriteCond %{HTTP_HOST} ^www\.domaintwo\.com [NC]
RewriteRule (.*) https://domaintwo.com/$1 [L,R=301]
RewriteCond %{HTTP_HOST} ^(ww+\.)?domaintwo\.com
RewriteCond %{REQUEST_URI} !/domaintwo-com/
RewriteRule ^(.*)$ /domaintwo-com/$1 [L]
RewriteCond %{HTTP_HOST} ^(www\.)?domainthree\.net$ [OR]
RewriteCond %{HTTP_HOST} ^(www\.)?domainthree\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.domainthree\.org [NC]
RewriteRule (.*) https://domainthree.org/$1 [L,R=301]
RewriteCond %{HTTP_HOST} ^(ww+\.)?domainthree\.org
RewriteCond %{REQUEST_URI} !/domainthree-org/
RewriteRule ^(.*)$ /domainthree-org/$1 [L]
我无法让 RewriteCond %{HTTP_HOST} ^www\. [NC]
在 IfModule 部分工作。这就是为什么每个域下面都有似乎是多余的代码:
RewriteCond %{HTTP_HOST} ^www\.domainone\.org [NC]
RewriteRule (.*) https://domainone.org/$1 [L,R=301]
如果我尝试在 IfModule 中将 HTTPS 和非 WWW 处理为两个单独的重写(请参阅下面的代码),则重定向会中断,并且我会在 Google Chrome 窗口中收到“重定向过多”错误。>
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
感谢您的帮助。
解决方法
请确保将这些规则放在您的 .htaccess 规则文件的顶部。使用您显示的样本,您能否尝试以下操作。在测试您的网址之前,请务必清除浏览器缓存。
Options +FollowSymLinks
RewriteEngine on
# Canonical HTTPS/non-WWW
<IfModule mod_rewrite.c>
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.*)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE]
</IfModule>
如果您只想对特定域执行 https 和非 www,请尝试以下操作。请一次使用以上或以下规则设置。
Options +FollowSymLinks
RewriteEngine on
# Canonical HTTPS/non-WWW
<IfModule mod_rewrite.c>
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^(?:www\.)?(domainone\.org|domaintwo\.com|domainthree(?:\.net|\.com))$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(domainone\.org|domaintwo\.com|domainthree(?:\.net|\.com))$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE]
</IfModule>
说明:为以上添加详细说明。
^(?:www\.)? ##Matching from starting of the value,where in a non-capturing group matching www followed by DOT keeping it optional here.
( ##Starting a capturing group here.
domainone\.org ##Matching domainone\.org here.
| ##OR condition to match either this or further values.
domaintwo\.com ##Matching domaintwo\.com here.
| ##OR condition to match either this or further values.
domainthree ##Matching domainthree here.
(?: ##Starting a non-capturing group here.
\.net|\.com ##Matching dot net OR dot com here.
) ##Closing non-capturing group here.
)$ ##Closing capturing group here.