我无法将所有请求更改为 https,同时使用以下内容来获得漂亮的 URL:
RewriteEngine On
RewriteBase /
RewriteRule ^/?([-_a-zA-Z0-9]+)$ /?p=$1
RewriteRule ^/?([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)$ /?par=$1&p=$2 [L]
我尝试在上面直接添加以下内容(并删除上面的 L 指令)但出现重定向错误:
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
我在这里做错了什么?
答案1
RewriteCond %{HTTP:X-Forwarded-Proto} !https
标X-Forwarded-Proto
头仅由代理服务器(或恶意客户端)设置,因此,除非您使用某种 SSL 代理,否则您不应该使用它(如果这样做,可能会导致重定向循环)。
任何规范重定向(HTTP 到 HTTPS 和/或非 www 到 www)都应出现前你的内部重写。
请尝试以下类似操作:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]
RewriteRule ^/?([-\w]+)$ /?p=$1 [L]
RewriteRule ^/?([-\w]+)/([-\w]+)$ /?par=$1&p=$2 [L]
我已将L
标志添加到您的第一次内部重写中。
只是\w
的简写字符类[_a-zA-Z0-9]
。
(如果这是在,.htaccess
那么/?
前缀RewriteRule
图案不需要。)
302
仅当您确定它正常工作时才将(临时)重定向更改为301
(永久),以避免测试时出现缓存问题。您需要确保在测试之前清除浏览器缓存。
理想情况下,您还应该在此处规范化 www / non-www,而不是依赖规范元标记。这可以与上面的 HTTP 到 HTTPS 重定向相结合。例如,要重定向到 www:
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=302,L]
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]
但是,这个特定的重定向确实假定您没有任何其他子域。