Regex 尝试使用重写规则同时匹配子域和路径,仅获取子域

Regex 尝试使用重写规则同时匹配子域和路径,仅获取子域,regex,apache,.htaccess,mod-rewrite,Regex,Apache,.htaccess,Mod Rewrite,我正在一个本地项目中做一些测试(使用vhost)。我已经设法创建了一个重写规则,将something.kensaku.com重定向到www.kensakuapp.com/something,但我想将something.kensaku.com/myapp重定向到www.kensakuapp.com/something/myapp 我的重写规则如下: Options +FollowSymLinks RewriteEngine On RewriteCond %{HTTP_HOST} ^(^.*)\.

我正在一个本地项目中做一些测试(使用vhost)。我已经设法创建了一个重写规则,将
something.kensaku.com
重定向到
www.kensakuapp.com/something
,但我想将
something.kensaku.com/myapp
重定向到
www.kensakuapp.com/something/myapp

我的重写规则如下:

Options +FollowSymLinks

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(^.*)\.kensaku.com
RewriteRule ^(^.*) goto.php?username=%1&path=$1
我已经试了几个小时了,但仍然无法获得
/myapp
部分。如果我转到
something.kensaku.com/myapp
$1
将匹配
goto.php
,但它不应该匹配
/myapp

下面是我用于重定向的
goto.php
脚本的内容:

<?php 
$user = $_GET['username'];
header("Location: http://www.kensakuapp.com/$user/".$_GET['path']); 
?>
编辑2:以下是虚拟主机:

# Kensaku Domains
<VirtualHost *:80>
   ServerAdmin admin@kensaku.com
   DocumentRoot /opt/lampp/htdocs/kensaku
   ServerName kensaku.com   
   ServerAlias *.kensaku.com
</VirtualHost>
<VirtualHost *:80>
   ServerAdmin admin@kensaku.com
   DocumentRoot /opt/lampp/htdocs/kensakuapp
   ServerName kensakuapp.com   
   ServerAlias *.kensakuapp.com
</VirtualHost>
#Kensaku域
服务器管理员admin@kensaku.com
DocumentRoot/opt/lampp/htdocs/kensaku
服务器名kensaku.com
ServerAlias*.kensaku.com
服务器管理员admin@kensaku.com
DocumentRoot/opt/lampp/htdocs/kensakuapp
服务器名kensakuapp.com
ServerAlias*.kensakuapp.com

在没有看到您的日志的情况下,我不能完全确定,但我的第一个猜测是您需要将传递标志(
[PT]
)添加到您的规则中:

RewriteRule ^(.*) /goto.php?username=%1&path=$1 [PT]
除了
PT
标志外,我还删除了您规则中错误的双精度
^
,并明确了
goto.php
的路径(这可能是必需的,也可能不是必需的,但可能是良好的做法)。关于
PT
标志,请记住
mod_rewrite
文档中的内容:

默认情况下,mod_rewrite将URL映射到文件系统路径

重写的目标(
goto.php?…
)不是文件系统路径,因此需要Apache对其进行进一步处理。
passthrough
标志是这样做的:

强制将生成的URI传递回URL映射引擎,以处理其他URI到文件名转换器,例如别名或重定向


如果这不能解决问题,请按要求发布日志,我们可以在不查看日志的情况下仔细查看日志。我不完全确定,但我的第一个猜测是,您需要在规则中添加传递标志(
[PT]
):

RewriteRule ^(.*) /goto.php?username=%1&path=$1 [PT]
除了
PT
标志外,我还删除了您规则中错误的双精度
^
,并明确了
goto.php
的路径(这可能是必需的,也可能不是必需的,但可能是良好的做法)。关于
PT
标志,请记住
mod_rewrite
文档中的内容:

默认情况下,mod_rewrite将URL映射到文件系统路径

重写的目标(
goto.php?…
)不是文件系统路径,因此需要Apache对其进行进一步处理。
passthrough
标志是这样做的:

强制将生成的URI传递回URL映射引擎,以处理其他URI到文件名转换器,例如别名或重定向


如果这不能解决问题,请按要求发布日志,我们可以仔细查看

这里不需要PHP

只需将所需的零件捕获到一个列表中,并在替换中使用它们即可

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.+?)\.kensaku\.com$
RewriteRule ^.*$ http://www.kensakuapp.com/%1/$0 [R,L]

这将在
%1
中的RewriteCond中捕获
某物
,并在
$0
中的RewriteRule中捕获
myapp
,此处不需要PHP

只需将所需的零件捕获到一个列表中,并在替换中使用它们即可

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.+?)\.kensaku\.com$
RewriteRule ^.*$ http://www.kensakuapp.com/%1/$0 [R,L]

这将在
%1
中的RewriteCond中捕获
something
,并在
$0
中的RewriteRule中捕获
myapp
中的
something

使用
RewriteLog
RewriteLogLevel
启用日志记录,并发布相关日志。已使用Olaf的规则尝试转到
www.kensaku.com
。启用使用
RewriteLog
RewriteLogLevel
进行日志记录,并发布相关日志。已使用Olaf规则尝试将日志转到
www.kensaku.com
。由于
www.kensaku.com
也应重定向到
kensakuapp.com/www
,我可以删除第一个重写条件,我不能吗?它也不能工作-转到
www.kensaku.com
给了我一个重定向循环错误…对你的第一个评论是的。我刚刚又测试了一遍,然后
olaf.kensaku.com/test
重定向到
www.kensakuapp.com/olaf/test
,与
www.kensaku.com/tast
相同,后者重定向到
www.kensakuapp.com/www/tast
。这里没有循环。您的.htaccess或服务器配置中是否有可能导致此问题的其他规则?不,我在htaccess或httpd.conf中都没有任何其他规则…@AddisonMontgomery我修改了规则以捕获根目录。我重读了你的问题,我想,我第一次错过了一些事实。您是否有两个独立的虚拟主机?一个用于
*.kensaku.com
和一个用于
www.kensakuapp.com
?由于
www.kensaku.com
也应该重定向到
kensakuapp.com/www
,我可以删除第一个重写,不是吗?它也不起作用-转到
www.kensaku.com
给了我一个重定向循环错误…对你的第一条评论是的。我刚刚又测试了一遍,然后
olaf.kensaku.com/test
重定向到
www.kensakuapp.com/olaf/test
,与
www.kensaku.com/tast
相同,后者重定向到
www.kensakuapp.com/www/tast
。这里没有循环。您的.htaccess或服务器配置中是否有可能导致此问题的其他规则?不,我在htaccess或httpd.conf中都没有任何其他规则…@AddisonMontgomery我修改了规则以捕获根目录。我重读了你的问题,我想,我第一次错过了一些事实。您是否有两个独立的虚拟主机?一个用于
*.kensaku.com
,一个用于
www.kensakuapp.com