httpd重定向,重写和条件无法按预期工作

时间:2017-02-24 21:22:53

标签: apache redirect url-rewriting httpd.conf

我的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$1

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

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

不应该发生重定向,导致新的请求无法重定向,然后应用重写?

另外,我在这里有更多的RedirectMatch行(在相关的行之后),但为了简化我的例子,我删除了它们。

1 个答案:

答案 0 :(得分:1)

对于简单的重定向,总是去重定向,但是如果你需要使用mod_rewrite,最好坚持下去,也就是说,混合重定向和重写会引起混淆,就像这个实际情况一样。

正在发生的事情是Rewrite首先发生,你的重写指令和重定向匹配都适用于同一件事(两者都不是/ end /,首先定义重定向不首先发生。

你想要的是描述一些符合你想要的东西:

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

这会按照您想要的偏好重定向。

如果最终目的地位于文件系统中,您可以尝试使用Redirect和Alias,我相信这样的事情,但我不确定这个,因为我不太了解您的设置:

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