.htaccess文件-通配符子域重定向


.htaccess file - Wildcard Subdomains Redirect

我有很多使用通配符配置的子域,例如

subdomain1.domain.com
subdomain2.domain.com
subdomain3.domain.com
(...)
subdomain89.domain.com

等等

它们指向/public_html/。在public_html中,我创建了

/public_html/subdomain1
/public_html/subdomain2
/public_html/subdomain3
(..)
/public_html/subdomain89

子文件夹。

我想将所有请求从子域(任何)重定向到各自子文件夹中的index.php文件,例如:

http://subdomain1.domain.com/
http://subdomain1.domain.com/about_us.php
http://subdomain1.domain.com/contact.php

重定向到/public_html/sudomain1/index.php.

http://subdomain2.domain.com/
http://subdomain2.domain.com/about_us.php
http://subdomain2.domain.com/contact.php

重定向到/public_html/sudomain2/index.php等

这是我的.htaccess:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www'.)?([a-z0-9-]+)'.domain'.com$ [NC]
RewriteRule !^([a-z0-9-]+)($|/) /%2%{REQUEST_URI}/index.php [PT,L]

当我访问subdomain1.domain.com时,我看到了/public_html/sudomain1中的index.php文件,但当我访问子域1.domain.com/about_us.php时,我得到了404。有什么想法吗?

感谢

我已经想通了。这是工作代码:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www'.)?([a-z0-9-]+)'.domain'.com$ [NC]
RewriteRule !^([a-z0-9-]+)($|/) /%2%{REQUEST_URI}/ [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]

:-)

首先确保.htaccess文件在文档根目录中(与index.php位于同一位置),否则它只会影响它所在的子文件夹(以及其中的任何子文件夹-递归)。

接下来对你的规则做一个小小的改变,使其看起来像:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?path=$1 [NC,L,QSA]

现在你只是在匹配。是任何字符的一个实例,您至少需要.*来匹配任何字符的任意数量的实例。

$_GET['path']变量将包含伪目录结构,例如/mvc/module/test,然后您可以在index.php中使用它来确定要执行的控制器和操作。

如果你想把整个shebang安装在一个子目录中,比如/mvc/或/framework/,那么最不复杂的方法就是稍微改变重写规则,将其考虑在内。

RewriteRule ^(.*)$ /mvc/index.php?path=$1 [NC,L,QSA]

并确保您的index.php在该文件夹中,而.htaccess文件在文档根目录中。

$_GET[路径]的替代方案(2018年2月和2019年1月更新)

将路径设置为$_GET变量实际上没有必要(现在也不常见),许多框架将依赖$_SERVER['REQUEST_URI']来检索相同的信息-通常是为了确定要使用哪个控制器-但原理完全相同。

这确实稍微简化了RewriteRule,因为您不需要创建路径参数(这意味着OP的原始RewriteRules现在可以工作了):

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [L,QSA]

然而,关于在子目录中安装的规则仍然适用,例如

RewriteRule ^.*$ /mvc/index.php [L,QSA]