努力寻找处理此问题的最佳方法。我们目前使用以下 htaccess 代码来生成更漂亮的 URL:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ ?id=$1 [QSA]
##Force SSL
RewriteCond %{HTTP:X-Forwarded-Proto} !https
这允许我们使用类似https://domain1.com/i-1234567890并在浏览器中显示,但页面显示为https://domain1.com/?id=i-1234567890
我们希望继续这样做,但也希望整合域名。所有 3 个域名都已通过 CNAME DNS 条目托管在同一台服务器上,但希望只使用一个域名,其他域名重定向。
解决此问题的最佳方法是什么?例如: http://domain2.com/i-1234567890和http://domain3.com/i-1234567890两条路线http://domain1.com/i-1234567890同时仍处理 QSA 并强制 https?
我还要补充一点,由于这台服务器只提供这些域名的服务,因此将所有流量重定向到http://domain1.com/i-1234567890而不是为每个域设置 RewriteCond。我尝试过几种方法,但都导致过多的重定向。
谢谢!
答案1
与您想要的内容进行匹配%{HTTP_HOST}
,并将不匹配的请求重定向到所需的服务器。
在其后添加如下内容RewriteEngine On
:
RewriteCond "%{HTTP_HOST}" !="domain1.com" [NC]
RewriteRule "^(.*)$" "https://domain1.com/$1" [R=301,L]
第一行检查 HTTP Host: 标头是否不等于([NC]
-> 不区分大小写)与domain1.com
完全相等。如果标头不同,例如domain2.com
,则满足条件并应用第二行的规则。
该规则采用整个路径(^(.*)$
正则表达式)并将其重定向([R=301]
即HTTP Moved Permanently
)到https://domain1.com/$1
$1 表示与前一个正则表达式匹配的原始路径的所有内容。[L]
意味着它是最后一条应用的规则,因此 Apache 停止处理 htaccess 文件。
当请求到达时https://domain1.com/blabla
,条件不满足且规则不适用,因此将处理 htaccess 的其余部分。
因此新的 htaccess 应该是这样的:
RewriteEngine On
RewriteCond "%{HTTP_HOST}" !="domain1.com" [NC]
RewriteRule "^(.*)$" "https://domain1.com/$1" [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ ?id=$1 [QSA]
##Force SSL
RewriteCond %{HTTP:X-Forwarded-Proto} !https