我有一个使用 mod_rewrite 的本地 Intranet,它有一个运行用户应用程序的框架,在某些情况下也需要 mod_rewrite,但我无法将两者结合起来很好地协同工作。
我希望特定的应用程序有自己的 .htaccess
来重写 URL,而不用担心框架需要执行的重写。因此,应用程序应该重写部分 URL 并让框架从那里接管。
先上代码:
/intranet/apps
中的应用程序框架.htaccess
:
RewriteEngine On
RewriteRule ^([^\/]+)\/([^\/.]+)\/\?(.+)$ $1/index.php?screen=$2 [QSA,NC,L]
RewriteRule ^([^\/]+)\/([^\/.]+)\/?$ $1/index.php?screen=$2 [QSA,NC,L]
/intranet/apps/myapp
中特定于应用程序的 .htaccess
:
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
,接下来处理父级的重写。
令人沮丧的是,仅在特定于应用程序的 .htaccess
中启用 RewriteEngine on
就足以将其分解为位。我显然遗漏了一些东西,但我似乎无法解决。
最佳答案
问题可能是继承的规则在 myapp
的上下文中不起作用。您需要 ^([^\/.]+)\/?$
内部 myapp
的正则表达式,因为应用于这些规则的 URI 将是 export/
,而不是 myapp/export/
(因为规则在 myapp
中)。
因此,要么将其添加到应用程序框架的 htaccess 文件(在文件末尾),要么添加到 myapp
中:
RewriteCond %{REQUEST_FILENANE} !-f
RewriteCond %{REQUEST_FILENANE} !-d
RewriteRule ^([^\/.]+)\/?$ index.php?screen=$1 [QSA,L]
关于apache - 多个 htaccess 中的 mod_rewrite 协同工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26186231/