2

使用最新版本的 SilverStripe,他们鼓励您使用服务器端规则进行 URL 重写,而不是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>
4

3 回答 3

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 。这种方法有可能进行双重重定向。

于 2017-11-15T03:35:43.810 回答
0

您可能希望首先将重写规则移到 SilverStripe 之上——它们可能是最后的。

其次,[L]您的规则上的标志表示“最后一个”并且将停止任何进一步的处理,您可能想尝试删除它们。

第三,从您的代码中,您可能会在这里看到一个 URL 的 2 个重定向(totla 中的 3 个请求),这(IMO)比不强制 www 和/或尾随的单个重定向更糟糕(因此对 SEO 影响)削减。

在我看来,您可以使用以下一组重定向来访问页面:

http://example.com/contact-us
http://example.com/contact-us/
https://www.example.com/contact-us/

另一种选择是 SS4 是使用 HTTPMiddleware 可以在 PHP 中为您强制执行此操作。虽然不推荐,但它可能更“便携”

于 2017-11-14T15:44:11.477 回答
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 - Page not found 错误。

于 2018-07-06T07:27:51.420 回答