【问题标题】:mod_rewrite in multiple htaccess working together多个 htaccess 中的 mod_rewrite 一起工作
【发布时间】:2014-10-04 07:54:42
【问题描述】:

我有一个使用 mod_rewrite 的本地 Intranet,它有一个运行用户应用程序的框架,在某些情况下也需要 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]

/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 就足以将其分解为位。我显然遗漏了一些东西,但我似乎无法解决。

【问题讨论】:

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


    【解决方案1】:

    问题可能是继承的规则在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]
    

    【讨论】:

    • 这正是我所需要的;我已经把它放在了 app-framework htaccess 中,所以 app-devvers 不必担心它,并且像一个魅力一样工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 2010-10-31
    • 2011-07-31
    • 2010-12-31
    • 2015-12-02
    • 1970-01-01
    • 2012-04-22
    相关资源
    最近更新 更多