重写的 httpd 重定向和条件未按预期工作

httpd redirect with rewrite and condition not working as expected

我在使用 Apache 重定向和重写时遇到问题,我不知道为什么我得到的东西不起作用。这是目标:

Browser URL:         http://127.0.0.1/app-gallery/all
Redirect (301) to:   http://127.0.0.1/apps/all
Serve file from:     /en/apps/all

在我的 httpd.conf 中,我有以下内容:

LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
RewriteEngine On

RedirectMatch 301 ^/app-gallery(.*) /apps

RewriteCond %{REQUEST_URI} !^/en/
RewriteRule ^(.*)$ /en/ [L,QSA]

包含最后两行(条件和规则)后,我的浏览器不会得到 301 重定向,只有 404。如果我去掉最后两行,重定向发生了 - 但我显然没有像我需要的那样从 /en/ 目录提供文件。

不应该发生重定向,导致新请求未被重定向,然后应用重写吗?

此外,我还有很多这样的 RedirectMatch 行(在相关行之后),但为了简化我的示例,我删除了它们。

对于简单的重定向总是使用重定向,但是如果你需要使用mod_rewrite,最好坚持使用它,也就是说,混合重定向和重写会造成混淆,就像这个实际案例。

发生的事情是 Rewrite 首先发生,并且您的 rewrite 指令和重定向匹配都适用于同一事物(两个原点都不是 /end/,首先定义重定向不会使其首先发生。

您想要的是描述将按照您想要的顺序进行的内容:

RewriteRule ^/app-gallery(.*) /apps [R=301]
RewriteRule ^/(?!en)(.*) /en/ [L,QSA]

这会按照您想要的优先顺序进行重定向。

如果最终目的地在文件系统中,您可以尝试使用重定向和别名,我相信是这样的,但我不确定这一点,因为我不太了解您的设置:

Redirect permanent /app-gallery/ /apps/
AliasMatch ^/apps/(.*) /filesystem/path/to/apps/