我更改了网站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]
答案 0 :(得分:1)
由于您的旧网址结构中有seasons
和episodes
(带有s
)以及season
和episode
(没有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]