Назад | Перейти на главную страницу

Перезапись Apache .htaccess не работает

Привет всем, бился головой об стену на этом и просмотрел много статей.

Мое задание

Я пытаюсь переписать 3 раздела сайта wordpress на https, если доступ к ним осуществляется через http:

/cart/ 

/my-account/ 

/checkout/

Помимо этого, worpress добавил перезапись, чтобы удалить index.php из URL-адреса.

Перезапись index.php - это единственное, что работает.

Моя конфигурация

вот мой .htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

#BEGIN MyRewrite
RewriteCond %{HTTPS} !on
RewriteCond %{REQUEST_URI} (checkout|cart|my-account)
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=302,L]
#END MyRewrite

# BEGIN WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
</IfModule>

Эта проблема

Кажется, меня перенаправляют на https, но затем он зацикливается и никогда не отображается.

Некоторые тесты Curl

Ниже вы можете увидеть мой доступ к http-версии / cart, чтобы правильно сказать, что она переехала в https / cart, поэтому я затем пробую версию https, чтобы мне сказали, что она перешла на ту же самую версию https, таким образом, цикл .

PS C:\Users\Stephen> C:\Users\Stephen\Downloads\curl-7.23.1-win64-ssl-sspi\curl.exe -k -i http://www.mysite.com/cart
HTTP/1.1 302 Found
Date: Wed, 20 Feb 2013 09:07:06 GMT
Server: Apache
Location: https://www.mysite.com/cart
Vary: Accept-Encoding
Content-Length: 285
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://www.mysite.com/cart">here</a>.</p>
<hr>
<address>Apache Server at www.mysite.com Port 80</address>
</body></html>

PS C:\Users\Stephen> C:\Users\Stephen\Downloads\curl-7.23.1-win64-ssl-sspi\curl.exe -k -i https://www.mysite.com/cart
HTTP/1.1 302 Found
Date: Wed, 20 Feb 2013 09:07:06 GMT
Server: Apache
Location: https://www.mysite.com/cart
Vary: Accept-Encoding
Content-Length: 285
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://www.mysite.com/cart">here</a>.</p>
<hr>
<address>Apache Server at www.mysite.com Port 80</address>
</body></html>

Правила перезаписи обрабатываются по порядку, и ваши первые два правила ( index.php rules) ловите все возможные запросы. Поскольку у них обоих есть [L] модификатор, обработка правил останавливается, когда они совпадают, что они всегда делают.

Правила переадресации под index.php правила никогда даже не проверяются. Попробуйте переместить их в начало файла (но после в RewriteEngine on линия) и имеющий index.php общее правило внизу.


В качестве примечания я настоятельно рекомендую тестировать перенаправления с помощью curl вместо использования браузера. Две конкретные проблемы, которых это позволяет избежать, - это кэшированные перенаправления и цепные перенаправления (здесь URL1 перенаправляет на URL2, который перенаправляет на URL3, и вы никогда не видите URL2 в браузере).

Либо curl -I <URL> или curl --include <URL> сделаю свою работу.

РЕДАКТИРОВАТЬ: приведенное ниже неверно - это было бы действительным, если бы это было в контексте VirtualHost, но поскольку оно находится в .htaccess, это не так.

Теперь, когда я выпил еще немного кофе, я понял, что вам нужно включить первую / в RewriteRule. Как это:

RewriteRule ^/secure https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]