.htaccess重定向到新的网站结构

时间:2019-05-17 18:18:43

标签: .htaccess mod-rewrite

我更改了网站URL结构,并希望重定向用户

问题

新结构非常不同,并且更加严格

OLD

1 - https://example.com/serie-tv

2 - https://example.com/serie-tv/1845578-the-walking-dead

3 - https://example.com/serie-tv/1845578-The-Walking-Dead/seasons/1

4 - https://example.com/serie-tv/1845578-the-walking-dead/seasons/1/episodes/1

1 - https://example.com/browse?type=series

2 - https://example.com/titles/1845578

3 - https://example.com/titles/1845578/season/1

4 - https://example.com/titles/1845578/season/1/episode/1

https://example.com/serie-tv/1845578-the-walking-dead/seasons/1

重定向

到  https://example.com/titles/1845578-the-walking-dead/season/1不起作用。

只需要重定向到https://example.com/titles/1845578/season/1

目前,我仅设法重定向了 https://example.com/serie-tv /.....https://example.com/browse?type=series

使用以下代码:

RewriteCond %{HTTP_HOST} ^example\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^serie\-tv\/?(.*) "https\:\/\/example\.com\/browse?type=series" [R=301,L]

2 个答案:

答案 0 :(得分:1)

由于您的旧网址结构中有seasonsepisodes(带有s)以及seasonepisode(没有s)添加到新的URL结构中,因此您不能使用仅复制URL路径的通用解决方案。

RewriteCond %{HTTP_HOST} ^example\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com$

如果您只有一个域,则这些条件是多余的。

RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$

目前,我们也可以忽略这些。自动更新SSL证书时,cPanel会根据需要自动注入它们。

  

目前,我仅设法重定向了...下的所有内容

我假设您不希望重定向“所有内容”,因为前面的示例URL并未说明这一点?

RewriteRule ^serie\-tv\/?(.*) "https\:\/\/example\.com\/browse?type=series" [R=301,L]

这里没有不必要的反斜杠转义,这会影响可读性。无需在- 模式中转义文字连字符(RewriteRule)和斜杠。在 substitution 字符串(这是一个“普通”字符串,而不是正则表达式)中,无需转义冒号(:),斜杠(再次)和点。这些“文字”字符在使用上下文中没有特殊含义。 (这是使用cPanel重定向功能的典型输出-经常也会将它们放在错误的位置。)

.htaccess文件顶部附近尝试以下方法:

RewriteEngine On

# Redirect "/serie-tv"
RewriteRule ^serie-tv$ /browse?type=series [R=302,L]

# Redirect "/serie-tv/1845578-the-walking-dead"
RewriteRule ^serie-tv/(\d+)-[^/]+$ /titles/$1 [R=302,L]

# Redirect "/serie-tv/1845578-the-walking-dead/seasons/1"
RewriteRule ^serie-tv/(\d+)-[^/]+/seasons/(\d+)$ /titles/$1/season/$2 [R=302,L]

# Redirect "/serie-tv/1845578-the-walking-dead/seasons/1/episodes/1"
RewriteRule ^serie-tv/(\d+)-[^/]+/seasons/(\d+)/episodes/(\d+)$ /titles/$1/season/$2/episode/$3 [R=302,L]

\d是数字的简写字符类(与[0-9]相同),而\d+则匹配1个或多个数字。

$1$2$3是对RewriteRule 模式中捕获的组的反向引用。在RewriteRule 模式中测试您可以执行的操作比使用检查REQUEST_URI服务器变量的先前条件更有效。

请注意,这些当前是302(临时)重定向。测试它们可以正常工作后,请仅将其更改为301(永久),以避免缓存问题。

在测试之前,您需要清除浏览器缓存。

此外:从SEO /可用性角度来看,包括标题的旧URL结构可能更好?

答案 1 :(得分:0)

我认为这应该可以满足您的需求。

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} /serie-tv$ [NC]
RewriteRule ^(.*)$ browse?type=series [R=301,L]

RewriteCond %{REQUEST_URI} /serie-tv/([0-9]*)\-([^/]*)/?(.*)? [NC]
RewriteRule ^(.*)$ titles/%1/%3 [R=301,L]