一个域上的 SEO URL 和重写规则强制

SEO URL and Rewrite Rule force on one domain

我有一个重写规则来强制用户从 example.com 转到 www.example.com。这是出于 SEO 原因,因此我的 Google 结果中没有重复的网站和内容。

 # BEGIN Spark

AddDefaultCharset UTF-8

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$  / [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) https://www.example.com/ [R=301,L]
</IfModule>

<IfModule mod_deflate.c>
<FilesMatch "\.(html|php|txt|xml|js|css|ttf|otf|ico|json|svg|)$">
SetOutputFilter DEFLATE
</FilesMatch>
</IfModule>
# END Spark

我的问题。如果现在人们 post a link example.com/news 他们总是会像 www.example.com 一样重定向到首页。我如何管理他们仍然可以使用和 post 短网址,如 example.com/news1example.com/news2,并将分别重定向到 www.example.com/news1www.example.com/news2

你把规则放在了错误的地方。它需要在 之前 内部重写(到前端控制器:index.php)。例如。在文件的顶部,而不是末尾。

将它放在最后只会正确重定向物理目录(包括主页)和静态资源(图像、CSS、JS 等)。通过前端控制器路由的所有其他“短 URLs”将被重定向到 index.php,您将看到“首页”。

并且...为了在使用包含尾部斜线的 URL 请求 example.com 时避免双重重定向,然后在尾部斜线删除规则中包含绝对 URL 并包括您的非 www 到 www 规则紧随其后。

例如:

RewriteEngine On

# Remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$  https://www.example.com/ [L,R=301]

# Redirect non-www to www
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) https://www.example.com/ [R=301,L]

RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

# Front-controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]

您需要在测试前清除浏览器缓存,因为错误的 301(永久)重定向将被浏览器缓存。 (测试 302 - 临时 - 重定向以避免缓存问题。)

旁白: 另一个问题是这些指令位于 # BEGIN Spark ... # END Spark 代码块内 - 这使得它们看起来好像指令可能由某些自动化过程维护?在这种情况下,它们可能会被覆盖?