多个htaccess中的mod_rewrite一起工作

时间:2014-10-03 20:21:34

标签: apache .htaccess mod-rewrite url-rewriting

我有一个使用mod_rewrite的本地内部网,它有一个运行用户应用程序的框架,在某些情况下也需要mod_rewrite,但是我无法将两者结合在一起发挥得很好。

我希望特定的应用程序有自己的.htaccess来重写URL,而不必担心重写框架需要执行的操作。因此,应用程序应该重写部分URL并让框架从那里接管。

首先,代码:

.htaccess中的应用框架/intranet/apps

RewriteEngine On
RewriteRule   ^([^\/]+)\/([^\/.]+)\/\?(.+)$   $1/index.php?screen=$2 [QSA,NC,L]
RewriteRule   ^([^\/]+)\/([^\/.]+)\/?$        $1/index.php?screen=$2 [QSA,NC,L]

.htaccess中的应用专用/intranet/apps/myapp

RewriteEngine On
RewriteOptions inherit
RewriteRule   ^export\/([0-9]+)\/?$   export/?pid=$1 [QSA,NC,L]

此应用具有导出功能,可接受某个ID进行处理。所以,打破这个:

网址www.intranet.com/apps/myapp/export/99

应该改写为

网址www.intranet.com/apps/myapp/export/?pid=99

由特定于应用的.htaccess。 现在,框架应该接管:

网址www.intranet.com/apps/myapp/export/?pid=99

网址www.intranet.com/apps/myapp/index.php?screen=export&pid=99

我的应用程序工作正常,因此框架会按照应有的方式进行重写,但一旦特定于应用程序的重写进入游戏,该页面就会崩溃并抛出404

据我了解,此场景首先处理特定于应用程序的重写,然后通过RewriteOptions inherit处理父级的重写。

令人沮丧的是,在应用专用RewriteEngine on中只有.htaccess就足以将其分解为位。我显然遗漏了一些东西,但我似乎无法解决这个问题。

1 个答案:

答案 0 :(得分:2)

问题可能是继承的规则在myapp的上下文中不起作用。您需要在^([^\/.]+)\/?$内使用myapp正则表达式,因为应用于这些规则的URI将为export/,而不是myapp/export/(因为规则位于myapp内})。

所以要么将其添加到app-framework的htaccess文件(文件末尾)或myapp中的文件:

RewriteCond %{REQUEST_FILENANE} !-f
RewriteCond %{REQUEST_FILENANE} !-d
RewriteRule ^([^\/.]+)\/?$ index.php?screen=$1 [QSA,L]