httpd重定向与重写和条件不按预期工作

问题描述:

我遇到了我的Apache重定向和重写的问题,我不知道为什么我没有工作。这是我们的目标:httpd重定向与重写和条件不按预期工作

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行在那里(相关之后),但为了简化我的示例,我删除了它们。

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

正在发生的事情是重写首先发生的事情,都你重写指令和redirectmatch申请过同样的事情(原籍不在/结束/,定义重定向先不让它第一次发生。

什么你要的是描述你想要的东西,将在顺序进入:

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

这重定向您要选择的顺序

如果最终目标是在文件系统中,你可以尝试使用重定向和别名与我相信这样的,但我不知道这一点,因为我不知道你的设置不够好:

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

谢谢 - 这很有道理。无论出于何种原因,R = 301 RewriteRule实际上并没有为我做重定向 - 这就是我发现RedirectMatch的原因。我使用了一个在线htaccess测试仪,它说他们应该重定向,所以我不得不多看看它。谢谢! – jcovert