我有一个使用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
就足以将其分解为位。我显然遗漏了一些东西,但我似乎无法解决这个问题。
答案 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]