Mod_rewrite:不同系统上的不同行为

时间:2015-02-20 13:08:26

标签: regex apache .htaccess mod-rewrite

我有以下.htaccess mod_rewrite规则:

RewriteEngine on
RewriteRule ^(abc1|abc2|abc3|abc-defg)/([^/]+)$  /redirect/category/$1/$2
RewriteRule ^(.+[^/])/$     /$1 [R=301,L]

现在我有以下网址:

http://www.example.com/abc-defg/cat1/

应该映射到

http://www.example.com/redirect/category/abc-defg/cat1

此规则适用于我的本地开发机器(Win7,Xampp),但不适用于生产服务器(使用Apache运行Ubuntu 12.04,mod_rewrite和mod_fcgid)。

在Ubuntu上,我被重定向到http://www.example.com/abc-defg/cat1(删除" /",这是第二条规则)。

我怎样才能找出为什么它没有按预期工作?

2 个答案:

答案 0 :(得分:0)

您必须在第一个规则之前放置301重定向规则:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+[^/])/$ /$1 [R=301,L,NE]

RewriteRule ^(abc1|abc2|abc3|abc-defg)/([^/]+)$ /redirect/category/$1/$2 [L,NC]

在新的浏览器中测试一下。

答案 1 :(得分:0)

你的正则表达式不匹配。

试试这个:

^(abc1|abc2|abc3|abc-defg)/([^/]+)/?$

您需要澄清它可以以斜线结尾。或者(但不推荐),不要用斜线结束。

www.example.com/abc-defg/cat1与正则表达式匹配 - 所以我认为这是你之前使用的。

那说完全有可能用户会在最后放一个斜线,所以最好考虑到它。