我有一个与GoDaddy共享的服务器,我在其中托管具有不同域名的不同网站。我的文件夹结构如下:
-- root (/)
|-- web1
| |-- index.php
| |-- ...
|
|-- web2
| |-- index.php
| |-- ...
|
|-- web3
| |-- index.php
| |-- ...
|
|-- .htaccess
对于每个网站,我都有一个域名(分别称为web1.com,web2.com和web3.com),我使用根文件夹中的.htaccess重定向,如下所示:
Options +FollowSymlinks
RewriteEngine on
RewriteCond %{HTTP_HOST} web1.com$ [NC]
RewriteCond %{REQUEST_URI} !^/web1/.*$
RewriteRule ^(.*)$ /web1/$1 [L,NC]
RewriteCond %{HTTP_HOST} web2.com$ [NC]
RewriteCond %{REQUEST_URI} !^/web2/.*$
RewriteRule ^(.*)$ /web2/$1 [L,NC]
RewriteCond %{HTTP_HOST} web3.com$ [NC]
RewriteCond %{REQUEST_URI} !^/web3/.*$
RewriteRule ^(.*)$ /web3/$1 [L,NC]
到目前为止,这对我一直很好,但现在我有一个问题:我有一个SSL证书,我想用web1,web2和web3,它工作正常,但由于名称的一些限制我可以包含在证书中(仅限5个),我想将所有流量从www.web1.com重定向到web1.com(删除www。),我还想重定向所有流量< strong>从http到https 。
在web1文件夹中,我使用以下规则创建了一个新的.htaccess:
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
# remove the www
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [R=301,QSA,NC,L]
# redirect from http to https
RewriteCond %{HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
它可以做它应该做的事情,但问题在于:网址不是https://web1.com/
,正如我所期望的那样https://web1.com/web1/index.php
。如果我从URL中删除/web1/
文件夹,则会收到404错误。
现在我的问题(感谢阅读,直到这里):
答案 0 :(得分:1)
它显示/web1/index.php
而不是/
,因为root .htaccess中的该规则正在REQUEST_URI
到/web1/index.php
。您需要从THE_REQUEST
变量中捕获URI值,该变量不会因先前规则的应用而发生变化。
在/web1/.htaccess
:
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /web1/
RewriteCond %{THE_REQUEST} \s/+web1/(\S*)\s [NC]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://web1.com/%1 [R=301,NE,L]
此外,您还可以看到如何将2个规则合并为一个。