Grundlæggende URL-omskrivning med Mod_Rewrite

Jeg har virkelig brug for følgende 3 funktioner på min hjemmeside:

  • www til ikke-www
  • HTTP til HTTPS
  • tving efterfølgende skråstreg i slutningen af ​​URL'erne

Jeg har en nuværende implementering, men jeg står over for en meget dårlig fejl.

Når jeg manuelt indtaster URL'en example.com/page i browseren, som browseren omdirigerer til example.com/?page/. Dette åbner selvfølgelig min hjemmeside og ikke det krævede /page/.

Jeg har prøvet mange eksempler og læst mange lignende spørgsmål i de sidste par uger. Ingen succes.

Her er min fulde .htaccess fil:

RewriteEngine on RewriteBase / # Redirects www to non-www RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] # Force ending url traling slash RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !(.*)/$ RewriteRule ^(.*)$ /$1/ [L,R=301] # Prevent CI index.php RewriteCond $1 !^(index\.php|resources|robots\.txt) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d #RewriteRule .* index.php/$0 [PT,L] RewriteRule ^(.*)$ index.php?$0 [L] # Prevent user access to the CI system folder. RewriteCond %{REQUEST_URI} ^system.* RewriteRule ^(.*)$ /index.php?/$1 [L] # Prevent user access to the CI application folder RewriteCond %{REQUEST_URI} ^application.* RewriteRule ^(.*)$ /index.php?/$1 [L] # Redirects http to https protocol RewriteCond %{HTTPS} !on RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} # Redirect index.php to the root / RewriteCond %{THE_REQUEST} ^.*/index\.php RewriteRule ^(.*)index.php$ /$1 [R=301,L] # One month for most static assets  Header set Cache-Control 'max-age=2628000, public'  RedirectPermanent /free-project-management-certification/ https://example.com/projectmanagement/ RedirectPermanent /free-scrum-master-certification/ https://example.com/scrummaster/ RedirectPermanent /product-owner-certification/ https://example.com/productowner/ RedirectPermanent /human-resources-management-certification/ https://example.com/humanresources/ RedirectPermanent /product-management-certification/ https://example.com/productmanagement/ RedirectPermanent /project-management-certification/ https://example.com/projectmanagement/ RedirectPermanent /index.php/ https://example.com/  # Compress HTML, CSS, JavaScript, Text, XML and fonts AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/vnd.ms-fontobject AddOutputFilterByType DEFLATE application/x-font AddOutputFilterByType DEFLATE application/x-font-opentype AddOutputFilterByType DEFLATE application/x-font-otf AddOutputFilterByType DEFLATE application/x-font-truetype AddOutputFilterByType DEFLATE application/x-font-ttf AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE font/opentype AddOutputFilterByType DEFLATE font/otf AddOutputFilterByType DEFLATE font/ttf AddOutputFilterByType DEFLATE image/svg+xml AddOutputFilterByType DEFLATE image/x-icon AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/xml # Remove browser bugs (only needed for really old browsers) BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html Header append Vary User-Agent  

Jeg ændrede positionerne for alle omdirigeringer, prøvede forskellige kombinationer, skiftede tegn, mange ting. Jeg ville virkelig sætte pris på noget hjælp.

# Redirects http to https protocol RewriteCond %{HTTPS} !on RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

Din HTTP til HTTPS-omdirigering er det forkerte sted. Det skal være øverst på din .htaccess straks efter RewriteBase direktivet og før www til ikke-www omdirigering. (Du mangler også R og L flag for at udløse en permanent omdirigere og forhindre yderligere behandling.)

Det kaldes i øjeblikket efter URL-adressen er blevet omskrevet til index.php?page/ (som er efter den første omdirigering for at tilføje skråstreg). Så HTTP til HTTPS-omdirigering ender med at omdirigere til https://example.com/index.php?page/ og en anden omdirigering fjerner derefter index.php for endelig at ende ved /?page/ - 3 omdirigeringer i alt!

Med andre ord:

  • Anmodning http://example.com/page (HTTP)
  • 301 omdirigere til http://example.com/page/ (tilføj efterfølgende skråstreg)
  • Intern omskrivning til http://example.com/index.php?page/
  • 302 omdirigere til http://example.com/index.php?page/ (siden mangler R=301 flag om direktiv)
  • 301 omdirigere til http://example.com/?page/ (fjernelse af index.php).

Som nævnt skal du flytte din HTTP til HTTPS-omdirigering til starten af ​​filen (dette er den rigtige rækkefølge, hvis du planlægger at implementere HSTS i fremtiden):

RewriteEngine on RewriteBase / # Redirects http to https protocol RewriteCond %{HTTPS} !on RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] # Redirects www to non-www RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] 

Du kan vende disse to regler for at forhindre en mulig dobbelt omdirigering, når du anmoder om det http://www.example.com/ (dvs. HTTP + www), men dette vil ikke være HSTS-kompatibelt (som siger, at du skal omdirigere til HTTPS på den samme vært).

Du har dog stadig flere konflikter mellem din mod_rewrite (RewriteRule, RewriteCond) omskrivninger og mod_alias (RedirectPermanent) omdirigeringer. Du bør undgå at blande omdirigeringer fra begge moduler.

RedirectPermanent /index.php/ https://example.com/ 

Dette RedirectPermanent direktiv er ikke påkrævet. Du udfører allerede den nødvendige omdirigering (for at fjerne index.php fra den synlige URL) med mod_rewrite tidligere i koden. Selvom det tilsvarende mod_rewrite-direktiv ikke ville fange en URL, der indeholdt efterfølgende stiinfo:

# Redirect index.php to the root / RewriteCond %{THE_REQUEST} ^.*/index\.php RewriteRule ^(.*)index.php$ /$1 [R=301,L] 

Undlad den bageste $ på den RewriteRule mønster for at tillade, at valgfri efterfølgende skråstreg (dvs. stiinfo) også fanges. dvs. RewriteRule ^(.*)index\.php /$1 [R=301,L].

RedirectPermanent /free-project-management-certification/ https://example.com/projectmanagement/ RedirectPermanent /free-scrum-master-certification/ https://example.com/scrummaster/ RedirectPermanent /product-owner-certification/ https://example.com/productowner/ RedirectPermanent /human-resources-management-certification/ https://example.com/humanresources/ RedirectPermanent /product-management-certification/ https://example.com/productmanagement/ RedirectPermanent /project-management-certification/ https://example.com/projectmanagement/ 

Du skal også konvertere de resterende mod_alias RedirectPermanent direktiver til tilsvarende mod_rewrite RewriteRule omdirigeringer og placere dem nær starten af ​​din fil (enten øverst, umiddelbart efter RewriteBase direktiv eller efter den kanoniske www til ikke-www / HTTP til HTTPS-omdirigeringer) for at undgå yderligere konflikter.

I øjeblikket med brug af mod_alias RedirectPermanentat anmode om en af ​​disse "omdirigerede" URL'er vil også udvise lignende adfærd. f.eks. Anmodning /free-project-management-certification/ og du vil blive omdirigeret eksternt til /projectmanagement/?free-project-management-certification/ på grund af tidligere omskrivninger (uanset om du oprindeligt anmoder om HTTP eller HTTPS).

Jeg antager, at disse er beregnet til at være 1 til 1 omdirigeringer. (Selvom RedirectPermanent direktivet er strengt mange til mange omdirigeringer på grund af dets præfiks-matchende natur.)

For eksempel:

RewriteRule ^free-project-management-certification/$ /projectmanagement/ [R=301,L] RewriteRule ^free-scrum-master-certification/$ /scrummaster/ [R=301,L] RewriteRule ^product-owner-certification/$ /productowner/ [R=301,L] RewriteRule ^human-resources-management-certification/$ /humanresources/ [R=301,L] RewriteRule ^product-management-certification/$ /productmanagement/ [R=301,L] RewriteRule ^project-management-certification/$ /projectmanagement/ [R=301,L] 

OPDATERING: Hvis du inkluderer disse omdirigeringer øverst i filen, kan du inkludere en fuldstændig absolut URL (som du oprindeligt gjorde) til mål-URL'en for at undgå flere omdirigeringer, når du anmoder om det ikke-kanoniske HTTP- eller www-underdomæne. f.eks. https://example.com/projectmanagement/.

Du bliver nødt til at rydde din browsercache inden test. Test med 302 (midlertidige) omdirigeringer og / eller med browser-caching deaktiveret for at undgå potentielle caching-problemer.

  • Mange tak! Det virker! Bare disse RewriteRule ^ free-project-management-certificering / $ / projectmanagement / [R = 301, L] omdirigerer til indekssiden, men de er ikke så vigtige.
  • Har du flyttet de specifikke omdirigeringer til gamle sider til starten af ​​filen? (Faktisk ville det måske være at foretrække at inkludere en absolut URL i disse omdirigeringer - for at undgå flere omdirigeringer, når der anmodes om ikke-kanonisk HTTP og / eller www. F.eks. RewriteRule ^free-project-management-certification/$ https://example.com/projectmanagement/ [R=301,L]

arbejdet for dig: Charles Robertson | Ønsker du at kontakte os?

nyttige oplysninger