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

时间:2015-11-13 11:56:23

标签: php apache .htaccess mod-rewrite 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

子文件夹。

我想将子域(any)中的所有请求重定向到相应子文件夹中的index.php文件,例如:

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

重定向到/public_html/subdomain1/index.php。

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

重定向到/public_html/subdomain2/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 / subdomain1中的index.php文件,但是当我访问subdomain1.domain.com/about_us.php时,我得到了404.有什么想法吗?

由于

2 个答案:

答案 0 :(得分:0)

我已经弄清楚了。这是工作代码:

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]

: - )

答案 1 :(得分:0)

首先,请确保您的.htaccess文件位于文档根目录(与index.php相同的位置)中,否则只会影响其所在的子文件夹(以及其中的所有子文件夹-递归)。 / p>

接下来,对您的规则进行一些更改,使其看起来像:

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中使用它来确定控制器和要执行的动作。 / p>

如果要将整个shebang安装在子目录(例如/ mvc /或/ framework /)中,最简单的方法是略微更改重写规则以将其考虑在内。

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

并确保index.php位于该文件夹中,而.htaccess文件位于文档根目录中。

$ _ GET ['path']的替代版本(18年2月和19年1月更新)

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

这确实稍微简化了RewriteRule,因为您无需创建path参数(这意味着OP的原始RewriteRule现在可以使用):

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

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

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