一个域上的 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/news1
或 example.com/news2
,并将分别重定向到 www.example.com/news1
或 www.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
代码块内 - 这使得它们看起来好像指令可能由某些自动化过程维护?在这种情况下,它们可能会被覆盖?
我有一个重写规则来强制用户从 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/news1
或 example.com/news2
,并将分别重定向到 www.example.com/news1
或 www.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
代码块内 - 这使得它们看起来好像指令可能由某些自动化过程维护?在这种情况下,它们可能会被覆盖?