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