apache - SEO URL 和重写规则强制一个域

标签 apache .htaccess redirect seo

我有一个重写规则来强制用户从 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/news1example.com/news2并将重定向到 www.example.com/news1www.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/

相关文章:

php - Index.php 在实时网站上导致空警报

php - Zend Framework 应用程序中的 "session has already been started...."异常

php - 仅限 php fatal error 的 error_reporting 编号是多少?

redirect - 网站 web.config > 是否可以将不正确的子域重定向到某个页面?

apache - mod_rewrite 还是 mod_alias?

wordpress htaccess 如何删除除 index.php 之外的所有 php 扩展

python - Django新手试图让treeio在Apache后面工作

带有代理授权的 Apache ProxyRemote(通过连接/HTTPS)

apache - .htaccess 重写测试失败

Apache 重写 : Always use HTTPS (how to add an exception)