使用htaccess将“丑陋” URL重定向到新URL

时间:2019-05-30 08:35:38

标签: regex apache .htaccess mod-rewrite

我已经重写了旧的“丑陋” URL:

http://example.com/ppd-brands/generic/?gen_id=Mjky

http://example.com/ppd-brands/generic/gen_id/Mjky

使用下面的代码

RewriteRule ^ppd-brands/generic/gen_id/([^/]*)$ /ppd-brands/generic/?gen_id=$1 [L]

,它正在工作。

现在我的问题是,当用户访问旧的“丑陋” URL时,如何将旧的“丑陋” URL重定向到新URL?

2 个答案:

答案 0 :(得分:1)

RewriteRule ^ppd-brands/generic/gen_id/([^/]*)$ /ppd-brands/generic/?gen_id=$1 [L]

仅仅是先驱……虽然您的旧“丑陋” URL的格式为/ppd-brands/generic/?gen_id=Mjky,但理想情况下,您应该重写到处理请求的实际文件中。 index.php,而不是允许mod_dir向目录索引发出额外的内部子请求-这就是我所假设的。

例如:

RewriteRule ^ppd-brands/generic/gen_id/([^/]*)$ /ppd-brands/generic/index.php?gen_id=$1 [L]

现在,您的主要问题...是从旧的“丑陋” URL外部重定向到新URL。在这种情况下,您需要注意重定向循环,因为如果我们只是简单地重定向,则上述重写将以无限循环的方式再次将其重写。出于这个原因,您不能使用mod_alias Redirect(如其他答案所示)。 (而且mod_alias Redirect也不能匹配查询字符串-另一个原因。)

此外:由于我们将上述重写更改为在重写的URL中包含index.php,这似乎与旧的“​​丑陋的” URL不同,所以我们也许可以避免使用如果您使用的是Apache 2.4,则可以进行简单的重定向(但Apache 2.2会导致冲突,因为mod_dir会为index.php 之前发出内部子请求,我们才可以使用mod_rewrite处理URL)。

我们只需要重定向初始请求,而不是已经重写的请求。我们可以通过检查REDIRECT_STATUS环境变量来做到这一点,该环境变量在初始请求中为 empty ,并在第一个请求后设置为“ 200”(与200 OK HTTP状态一样)成功重写。 (另一种方法是检查THE_REQUEST,而不是动态/可重写的URL路径。)

例如,在现有重写之前,尝试以下

# Redirect "old" to "new"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^gen_id=([^/&]*)
RewriteRule ^(ppd-brands/generic)/(?:index\.php)?$ /$1/gen_id/%1 [QSD,R=302,L]

请注意,为了匹配查询字符串,我们需要一个条件(RewriteCond指令)来检查QUERY_STRING服务器变量。由RewriteRule 模式匹配的URL路径特别排除了查询字符串。

请求URL中的index.php是可选的,因此它与/ppd-brands/generic/?gen_id=Mjky/ppd-brands/generic/index.php?gen_id=Mjky(如果这是实际URL)相匹配。

$1后向引用只是为了节省键入/重复。当指令匹配时,它将始终包含ppd-brands/generic。我们本可以对“ gen_id”进行相同的操作,但这可能会使 susbstitution 字符串看起来过于神秘。

%1反向引用(请注意%前缀)是对最后匹配的 CondPattern 中捕获的组的反向引用(与$1相对到RewriteRule 模式),即gen_id URL参数的值。

QSD标志(Apache 2.4+)从重定向的URL中剥离查询字符串。否则,gen_id=XYZ将传递到目标URL。如果仍使用Apache 2.2,则需要在{em> substitution 字符串的末尾附加一个?(本质上是一个空查询字符串)。例如。 /$1/gen_id/%1?

“魔术”实际上是检查REDIRECT_STATUS环境变量的第一个条件。如上所述,这确保了我们仅处理初始请求,而不处理重写的请求,从而避免了重定向循环。

请注意,这当前是302(临时)重定向。测试完成后,仅更改为301(永久)即可。 301会被浏览器永久缓存,因此可能会使测试出现问题。

为了澄清……仅在更改了应用程序中的所有URL后,才应实施此类重定向。这种重定向只是为了重定向搜索引擎,反向链接以及任何应该手动键入URL的人(不太可能)。

答案 1 :(得分:0)

Redirect 301 /oldurl.htm /newurl.htm

根据您的需要更改新旧URL。希望对您有帮助