重写康德REQUEST_URI - ^ 无法按预期工作



我正在codeigniter中构建一个站点。我有一系列重写条件&.htaccess文件中的规则。第一组规则根据uri的第一段打开或关闭SSL。

然后它再次循环通过&如果找到匹配项,则适当地重定向页面。如果没有匹配项,并且uri没有以列出的任何字符串开头,它会将您重定向到另一个页面。如果不满足任何条件,它将转到索引页。

问题是我的第一组规则打开了SSL;off。我想指定uri必须以admin或secure启动。但是如果我把^加到字符串的开头,所有的东西都会断开。这是我的:

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/?(admin|secure)
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{HTTPS} on 
RewriteCond %{REQUEST_URI} !^/?(admin|secure)
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]
...specific rewrites here
RewriteRule ^secure-form1$ secure/contract/secure-form1 [L]
RewriteRule ^secure$ secure/article/secure [L]
RewriteCond %{HTTP_HOST} ^www.example.com$ 
RewriteCond %{REQUEST_URI} !^/(admin|form|secure|page)/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/page/article/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

如果我在前两个重写条件中保留^符号(https打开和关闭),那么http://www.example.com/secure重写到https://www.example.com/index.php/secure/article/secure这是最后的重写规则。浏览器中的url实际上会更改为这个。

如果我把^符号从前两个重写条件中去掉,它就会转到右边。但我确实需要指定uri的开头,因为还有其他页面在uri的中间(并在斜杠后面)有"安全",不应该使用SSL。

我想不通这个。

试试这个:

RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} ^(.*)$ 
RewriteRule ^/?(admin|secure)$ https://%1/$1 [R=301,L]

我知道这个老问题,但如果你真的想坚持%{REQUEST_URI}条件,还有另一种解决方案可能会更好:

RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} ^/?(admin|secure)$
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

与OP的关键区别在于包含了/?,以检查URI开头是否存在正斜杠。AFAIK,不同的Apache安装可能会也可能不会在%{REQUEST_URI}中包含斜杠。

这样做的一个好处是,您可以将规则应用于多种条件:

RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} ^/?admin$ [OR]
RewriteCond %{REQUEST_URI} ^/?secure$ [OR]
RewriteCond %{REQUEST_URI} ^/?top-secret$
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

就我的想法而言,这比管道分隔字符串的长链更容易处理。与单个正则表达式相比,这是以潜在的效率损失为代价的,但您可以进行一些其他改进来抵消这一点:

  • 使用词法相等运算符!=on。如果您只使用off,它将被视为正则表达式。

  • 消除RewriteRule模式,将其替换为单个插入符号,然后使用环境变量%{HTTP_HOST}%{REQUEST_URI}。这节省了较长regex模式的开销以及backrefs。

最新更新