Přesměrování http → https

scientific
Člen | 50
+
0
-

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í:

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:

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 | 160
+
0
-

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 | 50
+
0
-

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.examplehttps://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.

Intapps
Člen | 8
+
0
-

Neřešíš ten problém náhodou u Wedosu? Kdyby jo, tak já ho snad najdu, měl jsem kdysi funkční, když jsem tam byl…

scientific
Člen | 50
+
0
-

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 | 208
+
+2
-

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í:

  1. můžeš smazat web/.htaccess
  2. 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 | 50
+
0
-

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)