关于 SSL 和规范化的 .htaccess 代码问题

.htaccess code questions about SSL and canonicalization

简而言之,我的网站只有一个付款页面。已安装 SSL 证书,但该付款页面不需要单独证书。

关于我的 .htaccess 文件 - 我目前使用以下代码分隔我的付款页面。我还阻止了来自 semalt.com 的访客。不记得确切原因,但我想我当时收到了他们不想要的关注(垃圾邮件)。

我想知道的是:

  1. 此代码在 5 年后仍然有效吗?
  2. 我是否需要通过指向 www 或非 www 版本的我的网站来解决规范化问题(重要的是不影响那个重要的 https 支付页面);有必要吗?
 1. Options +FollowSymlinks
 2. RewriteEngine On
 3. RewriteBase /
 4. # RewriteCond %{HTTP_HOST} !^example\.com$ [NC]
 5. # RewriteRule .* http://example.com%{REQUEST_URI} [L,R=301]
 6. 
 7. RewriteCond %{HTTPS} off
 8. RewriteRule ^payment\.html$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
 9. 
 10. # block visitors referred from semalt.com
 11. RewriteEngine on
 12. RewriteCond %{HTTP_REFERER} semalt\.com [NC]
 13. RewriteRule .* – [F]
 14. # End semalt block
 15. # block referer spam buttons for website
 16. RewriteEngine On
 17. RewriteCond %{HTTP_REFERER} buttons\-for\-website\.com
 18. RewriteRule ^.* - [F,L]
 19. # End buttons for website block
 20. 
 21. ErrorDocument 404 /404.html

我要解决的主要问题是您只是为您的支付页面重定向到 HTTPS。您应该为您的整个站点强制使用 HTTPS——无处不在。如今,浏览器会提醒用户,如果使用 HTTP(Google Chrome 在 URL 旁边声明 "Not Secure"),他们正在浏览不安全的连接,这是行不通的一切为了用户的信任。这是过去 5 年发生的主要变化 - HTTPS 是强制性的 无处不在

现在没有充分的理由使用 HTTPS。

假设您网站的其余部分已经是 HTTPS "ready"(我假设它一定是并且您没有将用户从您的支付页面发送回 HTTP?!)然后将 HTTP 更改为 HTTPS 重定向到包括您的整个网站:

# HTTP to HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

2) do I need to address canonicalization by directing to either a www or non-www version of mywebsite (importantly without affecting that one important https payments page); is it necessary?

是的,你应该。您的 .htaccess 文件顶部已经有指令 - 但它们被注释掉了?您可能已经在页面的头部设置了 rel="canonical" 元素,但除此之外,如果 www 和非 www 都可用,那么这可能是 重复内容 (相同内容可从 2 个或更多不同的 URLs 获得)。您需要决定:www 还是非 www?你目前看好哪个?哪个(主要)已经编入索引?您的付款页面使用哪个? (希望以上所有答案都是一样的。)

作为此重定向的一部分,也直接重定向到 HTTPS。这应该在 之前 当前 HTTP 到 HTTPS 重定向(与当前 .htaccess 文件中的顺序相同):

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

请注意,上面的 www 到非 www 重定向假设您没有使用任何其他子域。要重定向到 www.example.com,只需更改 example.com.

的两个实例
RewriteCond %{HTTP_REFERER} semalt\.com [NC]
RewriteRule .* – [F]

好的,如果有帮助 - 检查您的服务器日志是否对您有用。但是将 .* 正则表达式更改为 ^ (稍微更有效)。并且任何阻塞指令都应该位于文件的最顶部(您不想打扰规范化这些请求)。

RewriteCond %{HTTP_REFERER} buttons\-for\-website\.com
RewriteRule ^.* - [F,L]

再次 - 好的,它有帮助(是吗?!)。如上所述优化正则表达式。无需反斜杠转义 CondPattern 中的文字连字符(除非它们出现在字符 class 的中间)。与 F.

一起使用时不需要 L 标志

其他说明:

  • 无需重复 RewriteEngine On 指令。
  • 您的当前指令不需要 RewriteBase / 指令。
  • 在文件顶部定义您的 ErrorDocument 会更清楚。

总结

综合以上几点我们有:

Options +FollowSymlinks

ErrorDocument 404 /404.html

RewriteEngine On

# block visitors referred from semalt.com
RewriteCond %{HTTP_REFERER} semalt\.com [NC]
RewriteRule ^ – [F]

# block referer spam buttons for website
RewriteCond %{HTTP_REFERER} buttons-for-website\.com [NC]
RewriteRule ^ - [F]

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

# HTTP to HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]