Apache .htaccess 重写不起作用

Apache .htaccess 重写不起作用

大家好,我一直在为此绞尽脑汁,查阅了很多文章。

我的任务

如果通过 http 访问 wordpress 站点的 3 个部分,我尝试将其重写为 https:

/cart/ 

/my-account/ 

/checkout/

除了这些重写之外,worpress 还添加了重写以从 url 中删除 index.php。

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 测试

在下面您可以看到我访问 /cart 的 http 版本并被正确地告知它已移至 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>

答案1

重写规则按顺序处理,前两个规则(规则index.php)会捕获所有可能的请求。由于它们都带有[L]修饰符,因此当它们匹配时,规则处理会停止,而它们总是匹配。

规则下面的重定向规则index.php从未被测试过。尝试将它们移动到文件顶部(但在线上,并在底部RewriteEngine on有一个包罗万象的规则。index.php


附注:我强烈建议curl使用浏览器来测试重定向。这可以避免缓存重定向和链式重定向(在这种情况下,URL1 重定向到 URL2,URL2 又重定向到 URL3,而您在浏览器中永远看不到 URL2。)

二者curl -I <URL>curl --include <URL>可以完成工作。

答案2

编辑:下面是错误的 - 如果这是在 VirtualHost 上下文中,它将是有效的,但由于它在 .htaccess 中,所以它不是。

现在我喝了一点咖啡,我发现你需要/在 RewriteRule 中包含第一个。像这样:

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

相关内容