将资产请求重定向到 https,并使用 mod_rewrite 实现漂亮的 URL

将资产请求重定向到 https,并使用 mod_rewrite 实现漂亮的 URL

我无法将所有请求更改为 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]

但是,这个特定的重定向确实假定您没有任何其他子域。

相关内容