Přesměrování http → https
- scientific
- Člen | 94
Ahoj všem,
prosím o radu s přesměrováním. Našel jsem tu sice několik htaccess direktiv, ale všech 5 nebo kolik jsem jich našel nefungují dobře.
U všech chybělo jedno z níže uvedených přesměrování:
- http://domain.example → https://domain.example
- http://www.domain.example → https://domain.example
- https://domain.example → bez přesměrování
- https://www.domain.example → https://domain.example
Představuji si takovýhle podobný univerzální zápis pro htaccess.
Podmínky na správný zápis:
- Řeší všechny čtyři výše uvedené případy.
- Je obecný, neobsahuje staticky vepsanou doménu, i když to je detail, klidně, ať tam je, je to jen třešnička na dortu.
Mám zápis, který mi funguje mimo Nette:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
Ale nemohu ho použít, protože funguje pro Nette, špatně, zejména takto:
- http://domain.example → https://domain.example/www/ Zde je chyba výše uvedeného Htaccess zápisu. Jelikož je tam přítomen framework, tak si to nějak neumí poradit a přesměrovává špatně na /www/
- http://www.domain.example → https://domain.example
- https://domain.example → bez přesměrování
- https://www.domain.example → https://domain.example
Nemáte (a nedáte) někdo prosím takový htaccess zápis odladěný a
funkční?
Případně drobně poupravit mnou dodaný předpis přesměrování tak, aby to
nebugovalo s /www/.
Děkuji moc.
Editoval scientific (22. 10. 2020 11:00)
- Gappa
- Nette Blogger | 208
Mělo by fungovat toto, poslední část slouží pro hostingy
neumožňující posunutí document_root
do složky
www
.
# First rewrite to HTTPS:
# Don't put "www." here.
# If it is already there it will be included,
# if not the subsequent rule will catch it.
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Now, rewrite any request to the wrong domain to use www, preserve request scheme.
# doesn't start with www
RewriteCond %{HTTP_HOST} !^www\.
# contains no subdomains
RewriteCond %{HTTP_HOST} ^[^\.]+\.[^\.]+$ [NC]
# https_host might be empty (http 1.0, crawlers, api)
RewriteCond %{HTTP_HOST} (.+)$ [NC]
RewriteRule .* %{REQUEST_SCHEME}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Finally, rewrite to app dir
RewriteRule ^$ /www/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/www/
RewriteRule ^(.*)$ /www/$1
- scientific
- Člen | 94
Když to přidám do rootu projektu /path/to/web/, tak se to chová ještě hůř, než mnou uvedená pravidla. Tedy obsahuje chybu http://domain.example → https://www.domain.example/www/.
Špatně je na tom:
- Přidává sufix „www/“
- Oproti mnou uvedeným pravidlům navíc ještě přepisuje na doménu třetího řádu „www“.
Pro jistotu posílám můj celý /path/to/web/.htaccess:
RewriteEngine On
#RewriteRule (.*) www/$1 [L]
# First rewrite to HTTPS:
# Don't put "www." here.
# If it is already there it will be included,
# if not the subsequent rule will catch it.
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Now, rewrite any request to the wrong domain to use www, preserve request scheme.
# doesn't start with www
RewriteCond %{HTTP_HOST} !^www\.
# contains no subdomains
RewriteCond %{HTTP_HOST} ^[^\.]+\.[^\.]+$ [NC]
# https_host might be empty (http 1.0, crawlers, api)
RewriteCond %{HTTP_HOST} (.+)$ [NC]
RewriteRule .* %{REQUEST_SCHEME}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Finally, rewrite to app dir
RewriteRule ^$ /www/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/www/
RewriteRule ^(.*)$ /www/$1
Pro zkoušel jsem to i do /web/www/ adresáře zvenčí dostupné, takto /path/to/web/www/.htaccess:
# disable directory listing
<IfModule mod_autoindex.c>
Options -Indexes
</IfModule>
# enable cool URL
<IfModule mod_rewrite.c>
RewriteEngine On
# RewriteBase /
# prevents files starting with dot to be viewed by browser
RewriteRule /\.|^\. - [F]
# front controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz|map)$ index.php [L]
# First rewrite to HTTPS:
# Don't put "www." here.
# If it is already there it will be included,
# if not the subsequent rule will catch it.
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Now, rewrite any request to the wrong domain to use www, preserve request scheme.
# doesn't start with www
RewriteCond %{HTTP_HOST} !^www\.
# contains no subdomains
RewriteCond %{HTTP_HOST} ^[^\.]+\.[^\.]+$ [NC]
# https_host might be empty (http 1.0, crawlers, api)
RewriteCond %{HTTP_HOST} (.+)$ [NC]
RewriteRule .* %{REQUEST_SCHEME}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Finally, rewrite to app dir
RewriteRule ^$ /www/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/www/
RewriteRule ^(.*)$ /www/$1
</IfModule>
# enable gzip compression
<IfModule mod_deflate.c>
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/x-javascript text/javascript application/javascript application/json
</IfModule>
</IfModule>
Ani v tomto případě jsem se však sufixu „www/“ bohužel nezbavil. Též se přidává subdoména třetího řádu a jako bonus navrh web zobrazuje Internal Server Error 500.
Děkuji za snahu a budu se modlit, aby někdo měl funkčnější zápis, případně mi pomohl zjistit v čem je problém.
- scientific
- Člen | 94
Podle mě nehraje roli, kde to řeším. Je to na našem serveru. Avšak funguje to stejně, pokud tam nemáš nějak zadrátované absolutní cesty. I tak, upravit dle platné adresářové struktury je asi to nejmenší.
Budu tedy rád, když se pokusíš mi to najít, třeba to pomůže.
Toto je výchozí stav
Jinak v web/.htaccess mám toto:
RewriteEngine On
RewriteRule (.*) www/$1 [L]
V web/www/.htaccess mám pak toto:
# disable directory listing
<IfModule mod_autoindex.c>
Options -Indexes
</IfModule>
# enable cool URL
<IfModule mod_rewrite.c>
RewriteEngine On
# RewriteBase /
# prevents files starting with dot to be viewed by browser
RewriteRule /\.|^\. - [F]
# front controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz|map)$ index.php [L]
# all redirection HTTP -> HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# redirection www. -> https://
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
</IfModule>
# enable gzip compression
<IfModule mod_deflate.c>
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/x-javascript text/javascript application/javascript application/json
</IfModule>
</IfModule>
Editoval scientific (4. 11. 2020 10:45)
- nightfish
- Člen | 518
scientific napsal(a):
Je to na našem serveru.
Pokud je to na vašem serveru, tak bych jako první krok nasměroval
DocumentRoot
do .../web/www
(nyní míří do
.../web
).
Tím dosáhneš dvou věcí:
- můžeš smazat
web/.htaccess
- nebude hrozit, že by se při nějakém problému s konfigurací ve
web/.htaccess
někdo mohl dostat napřímo ke konfiguračním souborům
A teoreticky by to mělo vyřešit i zbytek, protože pravidla ve
web/www/.htaccess
vypadají v souladu s tím, čeho chceš
dosáhnout.
- scientific
- Člen | 94
Document root jsem právě řeši tím htaccessem, tím, že to napíšu přímo jako direktivu do apache nic neřeší. Je to totéž. Akorát tím obejdu hostingový panel, a může vzniknout nějaký konflikt, resp panel to stejně přepíše.
Ale při hledání v panelu, či nelze nastavit custom root, jsem si všiml, že lze nastavit www přesmerování a zároven http→ https. Takže jsem to nakonec vyřešil dvěma kliknutíma přes panel. :-) Díky všem.
Editoval scientific (4. 11. 2020 16:35)