我在.htaccess中有以下代码将所有页面重定向到https,除了一个(/ wc-api / v2),它们不能使用SSL。
它确实将所有页面重定向到https,但如果我转到/ wc-api / v2,它会将我重定向到/index.php。
# Custom Redirect
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} !^on$
RewriteCond %{REQUEST_URI} !^/wc-api/v2
RewriteRule (.*) https://example.com/$1 [R,L]
</IfModule>
# End Custom Redirects
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
FYI Wordpress需要第二个重定向块。我也无法将它们组合成一个单独的块,否则Wordpress将覆盖我的更改。
答案 0 :(得分:4)
在.htaccess
上下文中配置重写时,在应用最后一条规则后,整个过程将重新开始,使用内部重写的URL作为新的“输入”,直到不再有规则匹配为止。
这意味着,当您请求/wc-api/v2
时,它不会被重写为HTTPS,因为它会使您的第一个RewriteCond
失败,因此下一个块中的规则会在内部将其重写为/index.php
现在“下一轮”开始,/index.php
作为输入。 RewriteCond %{REQUEST_URI} !^/wc-api/v2
现在确实导致“true”,因为REQUEST_URI不再是/wc-api/v2
,现在是/index.php
。因此,RewriteRule
已应用 - 您将被重定向到https://example.com/index.php
要避免这种情况,您必须添加另一个RewriteCond
,这也会阻止规则应用于REQUEST_URI /index.php
:
RewriteCond %{HTTPS} !^on$
RewriteCond %{REQUEST_URI} !^/wc-api/v2
RewriteCond %{REQUEST_URI} !^/index\.php$
RewriteRule (.*) https://example.com/$1 [R,L]
答案 1 :(得分:0)
我的服务器上出现了上述建议的错误,因此对其进行了稍微修改,发现这对我有用:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REQUEST_URI} !^/wc-api/v2
RewriteCond %{REQUEST_URI} !^/index\.php$
RewriteRule (.*) https://www.example.com/$1 [R,L]
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
希望它适合你。