使用最新版本的SilverStripe,他们会鼓励您Director::forceSSL();
而不是Director::forceWWW();
和/或_config.php
,因为它被视为不可靠。
在Apache服务器上,逻辑上似乎建议应该通过.htaccess
文件进行管理。不幸的是,下面显示的片段可以独立激发重写,但是在单个文件中链接或组合似乎跳过www或https情况。
### SILVERSTRIPE START ###
### TRIMMED ROBOT/ERROR CODE ###
<IfModule mod_rewrite.c>
# Turn off index.php handling requests to the homepage fixes issue in apache >=2.4
<IfModule mod_dir.c>
DirectoryIndex disabled
DirectorySlash On
</IfModule>
SetEnv HTTP_MOD_REWRITE On
RewriteEngine On
RewriteBase '/'
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Deny access to potentially sensitive files and folders
RewriteRule ^vendor(/|$) - [F,L,NC]
RewriteRule ^\.env - [F,L,NC]
RewriteRule silverstripe-cache(/|$) - [F,L,NC]
RewriteRule composer\.(json|lock) - [F,L,NC]
RewriteRule (error|silverstripe|debug)\.log - [F,L,NC]
# Process through SilverStripe if no file with the requested name exists.
# Pass through the original path as a query parameter, and retain the existing parameters.
# Try finding framework in the vendor folder first
RewriteCond %{REQUEST_URI} ^(.*)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php
</IfModule>
### SILVERSTRIPE END ###
<IfModule mod_rewrite.c>
### FORCE TRAILING SLASH ###
### Source - https://paulund.co.uk/using-htaccess-to-force-trailing-slash ###
RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
### FORCE WWW ###
#### Modified from source https://paulund.co.uk/add-www-subdomain-to-all-urls-using-htaccess ###
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS} off
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L]
### FORCE SSL ###
RewriteCond %{HTTPS} off
RewriteRule ^ https://www.example.com/$1 [R=301,L]
</IfModule>
答案 0 :(得分:1)
我们的方法是在Apache虚拟主机文件中强制执行www和https:
<VirtualHost *:80>
ServerName www.myexampledomain.com
Redirect permanent / https://www.myexampledomain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName myexampledomain.com
Redirect permanent / https://www.myexampledomain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName www.myexampledomain.com
DocumentRoot etc etc
</VirtualHost>
最后我们使用此模块强制执行尾部斜杠:https://github.com/axllent/silverstripe-trailing-slash。这种方法有可能实现双重重定向。
答案 1 :(得分:0)
您可能想要将重写规则移到SilverStripe规则之上 - 它们可以是最后一个。
其次,规则中的[L]
标记表示“最后”,并且会停止任何进一步处理,您可能需要尝试删除它们。
第三,从你的代码中你可能会看到2个重定向(在totla中有3个请求)这里的URL(IMO)比没有强制执行www和/的单个重定向更糟糕的体验(因此SEO影响)或者是斜线。
在我看来,您可以使用以下一组重定向来点击页面:
http://example.com/contact-us
http://example.com/contact-us/
https://www.example.com/contact-us/
另一种选择是SS4是使用HTTPMiddleware,可以在PHP中为您强制执行此操作。虽然不推荐它可能会更“可移动”
答案 2 :(得分:0)
我们遇到了同样的问题,并将以下内容添加到/.htaccess文件(不是/public/.htaccess)
RewriteEngine On
# Redirect to www
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Redirect to https
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteRule ^(.*)$ public/$1
将规则添加到/public/.htaccess中导致重定向到https://www.your-domain.com/public,从而导致404-找不到页面错误。