0

我有一个项目,它有一个指向两个不同站点的启动页面。这些站点托管在同一台服务器上,它们应该位于不同的文件夹中以便更好地维护。

文件夹结构应该是这样的:

/home/user1234/public_html

    /splash/
        index.html
        css/
        images/
        ...

    /site1/
        index.php
        css/
        images/
        ...

    /site2/
        index.php
        css/
        images/
        ...

主要站点(站点 1 和站点 2,可能是两个 Wordpress 安装)必须可以在 url 结构之类的子目录下访问,而不是子域!所以url结构应该是:

www.MySite.tld --> Splash
www.MySite.tld/site1 --> Site1
www.MySite.tld/site2 --> Site2

现在我必须将这些 url 与它们在服务器上的相应目录相匹配。但我不知道该怎么做。不得不说是共享主机服务器,所以只能用htaccess和mod_rewrite来完成这个吧?

因此,在虚拟主机的管理界面中,我将 www.MySite.tld 指向 /splash 文件夹。然后我将 .htaccess 放在那个文件夹中,并将请求重写到“虚拟文件夹”/site1 和 /site2,如下所示:

RewriteEngine on

RewriteCond %{REQUEST_URI} ^/(site1|site2)/?$ [NC]

RewriteRule ^(.*)$ /home/user1234/public_html/%1 [L]

这不起作用,因为据我所知,不能仅使用 mod_rewrite 重写当前 DOCUMENT_ROOT (/splash) 之外的文件。所以我试图将 www.MySite.tld 指向 /public_html 而不是 /splash 的一级。现在对 /site1 和 /site2 的请求肯定可以工作,但对 / 的请求默认返回 404,因为如您在上面的文件夹结构中所见,其中没有索引文件。因此,我还将 .htaccess 放在 /public_html 中的上一级,并遵循以下规则:

RewriteEngine on

RewriteCond %{REQUEST_URI} ^/?$ [NC]

RewriteRule ^(.*)$ /splash [L]

现在可以访问启动页面,但是在 url 的末尾附加了一个“/splash”,这是我不想要的!

我一直在寻找解决方案好几个小时,并尝试了迄今为止发现的许多建议,但这些都没有解决我的问题。我尝试的最后一件事是使用 mod_rewrite 设置一些虚拟主机,但我也无法让它工作。可能我对 mod_rewrite 和所有其他 apache 的东西还不够确认。;-)

或者我可能只是缺少一些基本的东西,比如设置一个正确的 RewriteBase ......这个 url + 文件夹结构完全可以用 mod_rewrite 完成吗?如果是,我必须设置哪些重写规则?如果没有,我可以使用任何替代方案吗?任何帮助将不胜感激。

4

1 回答 1

1

您可以使用 mod_rewrite 轻松完成此操作。鉴于您概述的 URL 结构,请使用以下 .htaccess:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/(site1|site2|splash)/ [NC]
RewriteRule ^(.*) splash/$1 [L,PT]

RewriteCond将避免在请求 site1 或 site2 时重写,并且还可以防止对请求的无限循环/splash(这对于 .htaccess 实现尤其重要)。

If RewriteCondis a match(即请求不是针对三个路径中的任何一个)RewriteRule与所有 URL 匹配^(.*)并重写为splash/$1. 选项L,PT定义这应该是L|last规则(在 VirtualHost 上下文中很有用,在 .htaccess 中并不总是有效),并且请求应该PT|passthrough发送到后端(在这种情况下,再次是 Apache),而不发送重定向(30x)标头到客户端浏览器。

于 2013-05-22T20:05:22.830 回答