如何在SilverStripe 4中强制使用www,SSL和尾部斜杠?

时间:2017-11-14 04:20:52

标签: apache .htaccess mod-rewrite silverstripe silverstripe-4

使用最新版本的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>

3 个答案:

答案 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-找不到页面错误。