.htaccess更改重定向后显示文件夹名称

时间:2014-11-13 16:03:59

标签: apache .htaccess mod-rewrite redirect rewrite

我有一个与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错误。

现在我的问题(感谢阅读,直到这里):

  • 为什么重定向后文件夹中包含该文件夹? (我怎么能解决它?)
  • 是否有可能以我的方式实现这一点(在web1文件夹中使用.htaccess),还是应该简化并将这些规则移动到根文件夹中的.htaccess?
    • 可能会将规则移动到父级.htaccess会解决问题,是否可以在根目录中使用“特定于站点”的规则.htaccess?
  • 有更好的方法吗?我觉得我正在尝试重新发明轮子(因为我可能是:S)。

1 个答案:

答案 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个规则合并为一个。