我们的.htaccess
文件中有一些基于路径的重写规则。例如,如果URI指向/foobar/somestring
,则重定向到/foo/somestring
页,但我们也想强制通过https
加载资源。
我们可以在所有https://%{HTTP_HOST}
中包括RewriteRule
,首先解决更具体的URI,但是我很确定这不是必须的。
我已经浏览了apache flags docs,但是很难找到一种方法来告诉服务器以一种方式寻址scheme
并继续阅读规则和条件来寻址paths
。
这是我们现在所拥有的长期使用的方法:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} ^/foo
# Long list
RewriteRule ^foobar/(bat.*)$ https://%{HTTP_HOST}/foo/$1 [L,R=301]
RewriteRule ^foobar/(bas.*)$ https://%{HTTP_HOST}/foo/$1 [L,R=301]
# URI not found
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ https://%{HTTP_HOST}/index.php [L]
# And finally
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L,NC]
</IfModule>
非常感谢。
答案 0 :(得分:1)
此处的关键问题是了解the difference between a Redirect and a ReWrite。简而言之,重定向发生在客户端,更改了浏览器中的URL。重写发生在服务器端,对浏览器/客户端是透明的。
重定向的示例是将协议从http://
更改为https://
,或者添加或删除www
子域。
一个Rewrite的例子是接收/foo-bar-bas
之类的路径,然后将其发送给服务器以进行处理(通过ASP,Python,php,ruby on rails,node.js等) ),将其重写为article.aspx?name=foo_bar_bar
或类似的内容。
您可以在上面的OP中看到从http://
到https://
的重定向,当它位于规则块的顶部时,由于以下两个原因,正在使其下面的Rewrites短路标志:
R=301
告诉浏览器,“此(A)资源已移动,现在位于此(B)位置” L
告诉Apache,“停止处理规则集”。NC
表示忽略大小写,而/?(.*)
则不区分大小写。所有需要的是:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1
RewriteCond %{REQUEST_URI} ^/foobar
RewriteRule ^foobar/(bat.*)$ /foo/$1 [L,R=301]
RewriteRule ^foobar/(bas.*)$ /foo/$1 [L,R=301]
</IfModule>
令人困惑的部分是,我们使用“重写”规则来实现“重定向”(及其下面的重写。)Apache还支持{{1}之外的Redirect指令}}模块。我不确定这是否可以在这里工作。
在测试期间,应该使用302 found 状态代码而不是301 mod_rewrite标志的“已永久移动”状态代码将防止将错误消息发送到Web搜寻器或(可能是您自己的)浏览器。