我已经重写了旧的“丑陋” 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?
答案 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。希望对您有帮助