Обычно я оставляю часть 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 ###
Пошаговое объяснение:
Включает механизм перезаписи
RewriteEngine On
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();
}
Фактическое перенаправление
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 намного лучше (намного быстрее и только одно перенаправление)