2017-11-14 16 views
1

最新のバージョンのSilverStripeでは、ファイルではuse server side rules for URL re-writingであり、Director::forceSSL();および/またはDirector::forceWWW();ではないことが推奨されています。信頼性が低いとみなされます。SilverStripe 4でwww、SSL、およびスラッシュを強制するには?

Apacheサーバーでは、論理的には.htaccessファイルで管理する必要があるようです。残念ながら、以下に示すスニペットは独立して書き換えを実行することができますが、1つのファイル内で連鎖または結合すると、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

可能性のあるドキュメント化された.htaccessベースのソリューションは、https://stackoverflow.com/a/43052755/4137738 – wmk

答えて

0

おそらく、書き換えルールをSilverStripeの上に移動することから始めたいと思うかもしれません。

第2に、ルールの[L]フラグは「最後」を意味し、それ以上の処理を停止します。削除することをお勧めします。

第3に、(IMO)がwwwとそれを強制しない1つのリダイレクトよりも悪い経験(つまりSEOの影響)であるURLに対して2回のリダイレクト(合計3回のリクエスト) /または後続のスラッシュ。

あなただけのページをヒットするリダイレクトの次のセットを持つことができますようにそれは私になります

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

代替はSS4はPHPであなたのためにこれを強制することができHTTPMiddlewareを使用することです。お勧めできませんしながら、それはもう少し「トランスポータブル」可能性があり

+0

ありがとうございます。追加情報をお寄せいただきありがとうございます。独自の.htaccessを作成するためのドキュメントは、常に役立つとは限りません。私はすべての基盤を動的にカバーするが、そこに到達することはできない単一のルールを書くことを望んでいた。 – danielmcclure

+0

SilverStripeがRewriteRulesで達成したいと思うかもしれないさまざまな側面を完全に文書化しようとするのは本当に不可能です。SilverStripeのドキュメントは、.htaccessファイルにRewriteRulesを書くための標準的な、または完全なリファレンスには依存しません。 Apacheのドキュメントは、見た目がはるかに優れています。 - https://httpd.apache.org/docs/2.0/misc/rewriteguide.html –

+1

私は実際には、私が見つけた.htaccessのドキュメントであり、SilverStripeのドキュメントではありません。しかしあなたがリンクしているページは、私が見ていたものよりはるかに優れているので、もう一度ありがとう! – danielmcclure

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 。このアプローチでは、二重リダイレクトの機会があります。

+0

管理されたホスト上にあらかじめ設定されたコンテナを使用しているため、この方法を使用できるかどうかはわかりません。私は後でスラッシュのためのモジュールを使用しましたが、ありがとう! – danielmcclure

関連する問題