我有一个重写规则来强制用户从 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 ^(.*)/$ /$1 [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/$1 [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
我的问题。如果现在人们发个链接 example.com/news
他们总是会重定向到首页,如 www.example.com
.我如何管理他们仍然可以使用和发布短 URL,如 example.com/news1
或 example.com/news2
并将重定向到 www.example.com/news1
或 www.example.com/news2
分别。
最佳答案
你把规则放在错误的地方。它需要在内部重写之前进行(到前端 Controller : index.php
)。例如。在文件的顶部,而不是最后。
通过将其放在最后,它只会正确重定向物理目录(包括主页)和静态资源(图像、CSS、JS 等)。通过前端 Controller 路由的所有其他“短 URL”将被重定向到 index.php
你会看到“首页”。
并且...在请求 example.com
时避免双重重定向使用包含尾随斜杠的 URL 然后在尾随斜杠删除规则中包含一个绝对 URL,并在此之后立即包含您的非 www 到 www 规则。
例如:
RewriteEngine On
# Remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ https://www.example.com/$1 [L,R=301]
# Redirect non-www to www
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) https://www.example.com/$1 [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
代码块 - 这使得这些指令看起来好像是由某个自动化过程维护的?在哪种情况下,它们可能会被覆盖?
关于apache - SEO URL 和重写规则强制一个域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70045456/