将资产请求redirect到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指令),但得到redirect错误:

 RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

我在这里做错了什么?

 RewriteCond %{HTTP:X-Forwarded-Proto} !https 

X-Forwarded-Proto头只能由代理服务器(或恶意客户端)设置,所以,除非你在某种SSL代理的后面,否则你不应该使用这个(如果是这样的话,会导致redirect循环你做)。

任何规范的redirect(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 (临时)redirect更改为301 (永久),以避免testing时发生caching问题。 testing之前,您需要确保浏览器caching清除。

理想情况下,您也应该在这里对www / non-www进行规范化处理,而不是依靠规范的元标记。 这可以结合上面的HTTP到HTTPSredirect。 例如,要redirect到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] 

但是,这个特定的redirect确实假设你没有任何其他的子域名。