Silverstripe htaccess - PullRequest
       70

Silverstripe htaccess

0 голосов
/ 11 июля 2020

У меня есть веб-сайт платформы Silverstripe, на котором есть повторяющиеся URL-адреса для www, non-www, http и https.

Кажется, есть несколько решений, но окончательного ответа нет. Есть ли кто-нибудь, кто знает правильный код для файла htaccess для Silverstripe?

Я хочу, чтобы все страницы указывали на https: // www*1005*

Это текущий код в файле htaccess -

    ErrorDocument 401 /base/401.txt

### SILVERSTRIPE START ###

# Deny access to templates (but allow from localhost)
<Files *.ss>
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
</Files>

# Deny access to IIS configuration
<Files web.config>
    Order deny,allow
    Deny from all
</Files>

# Deny access to YAML configuration files which might include sensitive information
<Files ~ "\.ya?ml$">
    Order allow,deny
    Deny from all
</Files>

# Route errors to static pages automatically generated by SilverStripe
ErrorDocument 404 /assets/error-404.html
ErrorDocument 500 /assets/error-500.html

<IfModule mod_env.c>
    # Ensure that X-Forwarded-Host is only allowed to determine the request
    # hostname for servers ips defined by SS_TRUSTED_PROXY_IPS in your _ss_environment.php
    # Note that in a future release this setting will be always on.
    SetEnv BlockUntrustedIPs true
</IfModule>

<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
    </IfModule>

    RewriteEngine On
    
    # non-www to www redirect
    #RewriteCond %{HTTP_HOST} ^bolstered.com.au$ [NC]
    #RewriteRule (.*) https://www.bolstered.com.au/$1 [R=301,L]
    
    # http to https redirect
    #RewriteCond %{HTTPS} !=on 
    #RewriteRule ^ (.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    

    # Enable HTTP Basic authentication workaround for PHP running in CGI mode
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    
    # Deny access to potentially sensitive files and folders
    RewriteRule ^vendor(/|$) - [F,L,NC]
    RewriteRule silverstripe-cache(/|$) - [F,L,NC]
    RewriteRule composer\.(json|lock) - [F,L,NC]
    
    RewriteCond %{REQUEST_URI} ^(.*)$
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !\.php$
    RewriteRule .* index.php?url=%1&%{QUERY_STRING} [L]
</IfModule>
### SILVERSTRIPE END

1 Ответ

1 голос
/ 11 июля 2020

Обычно я оставляю часть SilverStripe между ### SILVERSTRIPE START ### и ### SILVERSTRIPE END ### нетронутой и помещаю свои правила только перед или после правил silverstripe.

Нет проблем с двойным RewriteEngine On. Я также не стал проверять, существует ли mod_rewrite, потому что он будет включен на всех моих серверах, и я бы не позволил клиенту размещать его на сервере без него.

Вот полный пример .htaccess который я обычно использую в проекте silverstripe:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^localhost [NC]
RewriteCond %{HTTP_HOST} !^127.0.0.1 [NC]
RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_HOST} !^www\.examle\.org [NC]
RewriteRule ^ https://www.examle.org%{REQUEST_URI} [R=301,L]


### SILVERSTRIPE START ###

# Deny access to templates (but allow from localhost)
<Files *.ss>
    Require ip 127.0.0.1
</Files>

# Deny access to IIS configuration
<Files web.config>
    Require all denied
</Files>

# Deny access to YAML configuration files which might include sensitive information
<Files ~ "\.ya?ml$">
    Require all denied
</Files>

# Route errors to static pages automatically generated by SilverStripe
ErrorDocument 404 /assets/error-404.html
ErrorDocument 500 /assets/error-500.html

<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

    # Enable HTTP Basic authentication workaround for PHP running in CGI mode
    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]
    RewriteRule ^Security - [F,L,NC]

    # Process through SilverStripe if no file with the requested name exists.
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule .* index.php
</IfModule>
### SILVERSTRIPE END ###

Пошаговое объяснение:

  1. Включает механизм перезаписи

    RewriteEngine On
    
  2. 4 RewriteCond - все условия, связанные с RewriteRule под ним.

    RewriteCond %{HTTP_HOST} !^localhost [NC] 
    RewriteCond %{HTTP_HOST} !^127.0.0.1 [NC]
    RewriteCond %{HTTPS} !on [OR]
    RewriteCond %{HTTP_HOST} !^www\.examle\.org [NC]
    

    Несколько условий будут логическим AND, если вы не добавите [OR].

    [NC] означает отсутствие регистра, поэтому регистр не учитывается

    Первые 2 являются исключением для localhost / 127.0.0.1, чтобы гарантировать, что перенаправление не будет выполнено, когда я разрабатываю на своей рабочей станции. 3 проверяет, выключен ли https 4 проверяет правильность домена.

    Итак, говоря псевдокодом, это выглядит так:

    if ($HTTP_HOST != "localhost" && $HTTP_HOST != "127.0.0.1" AND ($HTTPS != "on" OR $HTTP_HOST != "www.examle.org") {
        do_redirect();
    }
    
  3. Фактическое перенаправление

    RewriteRule ^ https://www.examle.org%{REQUEST_URI} [R=301,L]
    

    Он перенаправляет на желаемый домен и присоединяет к нему путь (/foo/bar) и параметры запроса (?foo=bar). R = 301 - это код ответа http. Если вам нужно временное перенаправление, вы можете сделать его 302. L означает Last Я думаю, что остановит обработку на этом этапе и не будет продолжать пробовать другие правила ниже.

Альтернативы:

.htaccess - лучший способ сделать это. Но стоит отметить, что это не единственный вариант.

Вы можете сделать это просто PHP, в конфигурации любого / большинства веб-серверов, ... И SilverStripe имеет встроенные методы для выполнения проверки & redirect:

Director::forceSSL();
Director::forceWWW();

но, как уже говорилось, .htaccess намного лучше (намного быстрее и только одно перенаправление)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...