Apache2 htaccess有多个规则

时间:2014-09-15 15:32:11

标签: apache .htaccess mod-rewrite

我们为客户端构建了一个Web应用程序,应该在调用某些特定URL时显示该应用程序。所有其他网址应由现有的Typo3安装处理。不幸的是,我们无法访问Apache2配置,因此无法访问重写日志或更改VirtualHost定义。

.htaccess看起来大概是这样的:

RewriteEngine On

# http://example.com/sub/foo/
RewriteCond %{REQUEST_URI} ^/sub/foo/.*
RewriteRule .* special.php [L]

# http://example.com/sub/bar/year/2014/
RewriteCond %{REQUEST_URI} ^/sub/bar/.*
RewriteRule .* special.php [L]

# Everything else should be typo3
RewriteRule .* general.php [L]

但是,所有呼叫都会路由到general.php文件。根据{{​​3}},.htaccess应该按预期工作。服务器是Apache 2.2。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您需要从上一个规则中排除special.php。规则1和规则2也可以合并为一个:

RewriteEngine On

# http://example.com/sub/foo/
RewriteRule ^sub/(foo|bar)/ special.php [L,NC]

# Everything other than /special.php should be typo3
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule !^special\.php$ general.php [L,NC]

更新(Lars):解决方案是了解[L] - 标志的工作原理。它重新运行整个循环,因此必须以某种方式编写每个重新执行规则,否定已经重写的部分。另外,从.htaccess目录中的/sub/ - 文件的角度来看,我放置了所有规则,第一个目录必须省略,如下所示:

RewriteEngine On

# http://example.com/sub/foo/
RewriteRule ^(foo|bar)/ special.php [L,NC]

# Everything other than /special.php should be typo3
RewriteRule !^special\.php$ general.php [L,NC]