.htaccess :: mod_rewrite :: Kom funziona?

Jeg har læst alt, hvad jeg kunne og ikke kan finde ud af. Jeg har brug for en simpel sideomdirigering, der holder det originale underdomæne. Vi har flere butikker på deres egne underdomæner med identiske produktnavne, så hvis nogen besøger webadresser som disse:

https://XYZ.example.com/old-product.html https://ABC.example.com/old-product.html 

Vi er nødt til at omdirigere dem til den nye produktside sådan:

https://XYZ.example.com/new-product-page.html https://ABC.example.com/new-product-page.html 

Jeg prøvede noget simpelt som dette, men det omdirigerer til vores vigtigste www-sted i stedet for at beholde underdomænet.

RewriteRule ^old-product.html$ new-product-page.html [NC] 

Jeg ved ikke, hvordan man fanger underdomænet og bruger det til omskrivningen. Kan nogen hjælpe mig? Tusind tak.

REDIGERE: Her er min .htaccess file, det er et Magento 1.9-sted:

# Force www RewriteCond %{HTTP_HOST} ^example.com RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$ RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$ RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$ RewriteRule (.*) https://www.example.com/$1 [R=301,L] SetEnvIf SERVER_PORT 443 HTTPS=on # Force https RewriteCond %{HTTPS} off RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$ RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$ RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE] # XYZ Env Variables SetEnvIf Host www\.XYZ\.example\.com MAGE_RUN_CODE=XYZ_website SetEnvIf Host www\.XYZ\.example\.com MAGE_RUN_TYPE=website SetEnvIf Host ^XYZ\.example\.com MAGE_RUN_CODE=XYZ_website SetEnvIf Host ^XYZ\.example\.com MAGE_RUN_TYPE=website # ABC Env Variables SetEnvIf Host www\.ABC\.example\.com MAGE_RUN_CODE=abc_website SetEnvIf Host www\.ABC\.example\.com MAGE_RUN_TYPE=website SetEnvIf Host ^ABC\.example\.com MAGE_RUN_CODE=abc_website SetEnvIf Host ^ABC\.example\.com MAGE_RUN_TYPE=website  ############################################ ## make HTTPS env vars available for CGI mode SSLOptions StdEnvVars   ############################################ ## enable rewrites Options +FollowSymLinks RewriteEngine on  

REDIGER 2: Nå, jeg fandt ud af en del af svaret:

RewriteCond %{HTTP_HOST} ^(.*)\.example\.com [NC] RewriteRule ^(.*)old-product.html$ new-product-page.html [R=301,L] 

Det returnerer en URL som denne:

https://www.example.com/live/public_html/new-product-page.html 

Hvordan kan jeg fjerne /live/public_html en del?

RewriteCond %{HTTP_HOST} ^(.*)\.ourdomain\.com [NC] RewriteRule ^(.*)old-product.html$ new-product-page.html [R=301,L] 

For en ekstern omdirigering er udskiftning streng (2. argument til RewriteRule direktiv) skal være enten rodrelativ (startende med en skråstreg) eller absolut (skema + værtsnavn). Medmindre du har angivet en RewriteBase direktiv andetsteds i din konfiguration. Så det burde det være /new-product-page.html (med et skråstreg-præfiks).

EN i forhold substitutionsstreng ses som relativt til den mappe, der indeholder .htaccess fil. Og dette resulterer i, at bibliotekspræfikset tilføjes tilbage, deraf live/public_html/ del i din resulterende omdirigering (dette er OK for en intern omskrivning).

Prøv for eksempel følgende regel. Det betyder ikke rigtig, hvor dette går, selvom det ville være logisk at have det efter "Force https" -reglen.

RewriteCond %{HTTP_HOST} ^(xyz|abc)\.example\.com [NC] RewriteRule ^old-product\.html$ /new-product-page.html [R=302,L] 

Hvis du kun vil omdirigere specifikke underdomæner / værtsnavne, så skal du kontrollere Host header (dvs. HTTP_HOST servervariabel). Selvom du i dit direktiv gjorde dette meget generelt - at omdirigere ethvert underdomæne? Hvis omdirigeringen ikke er afhængig af værtsnavnet, skal du fjerne betingelsen helt.

Hvis du vil omdirigere /old-product.html kun så behøver du ikke (.*) præfiks, som du havde i dit direktiv.

Når serveren konstruerer omdirigeringssvaret, vil den (som standard) bevare skemaet og værtsnavnet fra anmodningen. Der er intet andet, du skal gøre, medmindre din server er konfigureret andet. (Serveren kunne konfigureres til altid at bruge det definerede ServerNameDette er dog ikke standard.)

Bemærk, at dette er en 302 (midlertidig) omdirigering. Skift kun til en 301 (permanent), når du har bekræftet, at det hele fungerer OK. 301'er cachelagres vedvarende af browseren, så det kan gøre testning problematisk.


Ovenstående resulterer dog i to omdirigeringer, når de anmoder om http://xyz.example.com/old-product.html (bemærk HTTP) - uanset hvor du placerer direktivet. Da omdirigering til HTTPS er separat.

For at "rette" dette, så du kun højst får en omdirigering, angiv en absolut URL (inkluder HTTPS-ordningen) og placer denne øverst i .htaccess fil:

RewriteCond %{HTTP_HOST} ^(xyz|abc)\.example\.com [NC] RewriteRule ^old-product\.html$ https://%{HTTP_HOST}/new-product-page.html [R=302,L] 

Jeg prøvede noget simpelt som dette, men det omdirigerer til vores vigtigste www-sted i stedet for at beholde underdomænet.

RewriteRule ^old-product.html$ new-product-page.html [NC] 

Dette er en "intern omskrivning" (fravær af R flag), ikke et ekstern "omdirigere". Og givet .htaccess fil som sendt, kunne dette ikke have udløst en ekstern omdirigering.

Hvis du så en "omdirigering", kan noget andet i Magentos kodebase muligvis have udløst dette. Hvordan håndterer dit websted 404s?

  • 1 Fantastisk! Det fungerer perfekt. Mange tak for forklaringen også. Bare et FYI for andre brugte jeg (. *) I stedet for (xyz | abc) til at håndtere ethvert underdomæne.

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

nyttige oplysninger