2010-01-16 12 views
12

Oto kod mam aktualnie w moim pliku .htaccess:.htaccess przekierowanie 301 dla wszystkich https do http wyjątkiem jednego STRONIE

Options +FollowSymLinks 
RewriteEngine on 
RewriteBase/
RewriteCond %{HTTP_HOST} ^example.com [NC] 
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301] 

RewriteEngine On 
RewriteCond %{HTTPS} on 
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

wiem jack o przepisuje ... i wszystkich innych stanowisk na ten temat naprawdę nie pasuje do moich kryteriów i nie wiem wystarczająco dużo o języku, aby go rozszyfrować.

Zasadniczo co potrzebne jest to:

  1. przekierować wszystkie przypadki "example.com" na "www.example.com"
  2. przekierować wszystkie przypadki "https //www.example .com "to" http: //www.example.com "z wyjątkiem 1 strony !!!! (jeśli ma to znaczenie, nazwa pliku tej strony to payments.php)

Kod, który mam powyżej działa, ale dla 1 strony, która musi być https, przepisuje adres URL na http. Ta jedna strona musi być https.

Dzięki, Chris

+0

Dziękuję wszystkim za wkład! Chris – dell116

Odpowiedz

10

Apache/2.2.6 (Win32) mod_ssl/2.2.8 OpenSSL/0.9.8g PHP/5.2.6

Przetestowałem go lokalnie, wszystkie przypadki użycia wydaje się działać prawidłowo. Jeśli masz dodatkowe pytania, możesz je zadać.

# Rewrite Rules for example.com 
RewriteEngine On 
RewriteBase/

# Redirect from example.com to www.example.com 
RewriteCond %{HTTP_HOST} ^example\.com [NC] 
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L] 

# Turn SSL on for payments 
RewriteCond %{HTTPS} off 
RewriteCond %{SCRIPT_FILENAME} \/payments\.php [NC] 
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] 

# Turn SSL off everything but payments 
RewriteCond %{HTTPS} on 
RewriteCond %{SCRIPT_FILENAME} !\/payments\.php [NC] 
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L] 

WAŻNE! Gdy użytkownik nawiguje z dowolnego https stronie z www do dowolnego https stronie bezwww, on poproszony o zaakceptowanie certyfikatu bezpieczeństwa Twojego non-www domeny.

Na przykład (TAK = żądanie, aby zaakceptować certyfikat, nie - odwrotny):

1) https://www.asdf.com/payments.php - YES (www.asdf.com) 
2) http://www.asdf.com/phpinfo.php - NO 
3) https://asdf.com/phpinfo.php - YES (asdf.com) 
4) https://www.asdf.com/phpinfo.php - NO 

starałem się uporządkować zasady w .htaccess bez powodzenia. Jeśli ktokolwiek znajdzie lepsze rozwiązanie, będzie to bardzo cenne.

+0

Dziękujemy! Działa idealnie. W międzyczasie chciałbym przeczytać więcej tego typu rzeczy. Czy masz jakieś dobre sugestie? – dell116

+1

Możesz zawsze przeczytać instrukcję;) http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html –

-1
# Rewrite Rules for example.com 
RewriteEngine On 
RewriteBase/

# Redirect from example.com to www.example.com 
RewriteCond %{HTTP_HOST} ^example\.com [NC] 
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L] 

# Disable SSL on pages other than payments.php 
RewriteCond %{HTTPS} on 
RewriteCond %{REQUEST_URI} !^payments\.php$ 
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L] 

# Require SSL on payments.php 
RewriteCond %{HTTPS} !on 
RewriteCond %{REQUEST_URI} ^payments\.php$ 
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L] 

nie testowałem go, ale coś takiego powinno działać

Edit: Updated

+0

To nadal pozwala wszystkim stronom na https (nie przepisywanie ich na http). Nie przepisuje to http://www.example.com/payments.php na https://www.example.com/payments.php Pierwsze przekierowanie nadal działa. Widzę, do czego zmierzasz ... i wygląda na to, że masz rację ... po prostu nie działa. Jakieś inne pomysły? Dzięki, Chris – dell116

+0

Dostroiłem trochę twój kod. Jedną z kwestii jest jednak konieczność zaakceptowania zarówno certyfikatów example.com, jak i www.example.com. –

5

oprócz świetne rozwiązanie William, można negować Żądaj uri gdzieś przed https przepisanie

RewriteCond %{REQUEST_URI} !^/?payments\.php 
+0

To naprawdę jest właściwe rozwiązanie. – dotancohen

0

To był miły post i wydaje się, aby przekierować do prawidłowego http ale chcę coś, jak na poniższym

RewriteCond %{HTTP_HOST} ^site\.com 
RewriteRule (.*) http://www.site.com/$1 [R=301,L] 

#RewriteCond %{SERVER_PORT} !^443$ 
#RewriteRule ^products https://www.site.com/products/ [R=301,L] 

# Disable SSL on pages other than payments.php 
RewriteCond %{HTTPS} on 
RewriteCond %{REQUEST_URI} !^products 
RewriteRule ^(.*)$ http://www.site.com/$1 [R=301,L] 

# Require SSL on payments.php 
RewriteCond %{HTTPS} !on 
RewriteCond %{REQUEST_URI} ^products\/?$ 
RewriteRule ^(.*)$ https://www.site.com/$1 [R=301,L] 


RewriteCond $1 !^(index\.php|images|js|css|static|img|payment|robots\.txt|blank.gif) 
RewriteRule ^(.*)$ index.php/$1 [L] 

mój adres URL jest http://www.sitename.com i tylny ukośnik jest opcjonalny co potrzebne jest tam, jeśli nie ma tekstu takiego jak produkty w adresie URL, to musi on on http: // i jeśli jest tam produkty smyczkowe w URI, to powinno być https: //

jak to zrobić ... kiedy ja spróbowałem, że przejdzie w pętlę ... pętlę przekierowania.

Używam pracy ramek codeigniter i usunąłem index.php z adresu URL.

więc jeśli coś http://sitename.com/products nastąpiło potem chcę go mieć https://sitename.com/products

a jeśli nie ma produktów w adresie URL, a następnie należy go przekierować do http: //