我有一个复杂的问题,我试图解决。 我已经使用下面的.htaccess指令来启用某种漂亮的url,并且工作正常。 例如, http ://myurl.com/shop将被redirect到http://myurl.com/index.php/shop ,这是很好的工作(请注意,这样的东西,如myurl.com/css/mycss.css )不会redirect:
RewriteEngine on RewriteCond ${REQUEST_URI} !^(index\.php$) RewriteCond %{SCRIPT_FILENAME} !-f RewriteCond %{SCRIPT_FILENAME} !-d RewriteRule ^/?(.*)$ index.php/$1 [L]
但现在,我已经在我的网页上引入了SSL,我想要以下行为:除了admin.php和login.php外,我基本上都希望上述行为适用于所有页面。 对这两个页面的请求应该被redirect到HTTPS部分,而所有其他的请求应该按照上面的规定进行处理。
我已经拿出了以下.htaccess,但它不起作用。 h tps://myurl.com/shop不会被redirect到h tp://myurl.com/index.php/shop,h tp://myurl.com/admin.php不会被redirect到h tps ://myurl.com/admin.php。
RewriteEngine on RewriteCond %{HTTPS} on RewriteCond %{REQUEST_URI} !^(admin\.php$|login\.php$) RewriteRule ^(.*)$ http://%{HTTP_HOST}/${REQUEST_URI} [R=301,L] RewriteCond %{HTTPS} off RewriteCond %{REQUEST_URI} ^(admin\.php$|login\.php$) RewriteRule ^(.*)$ https://myurl.com/%{REQUEST_URI} [R=301,L] RewriteCond %{REQUEST_URI} !^(index\.php$) RewriteCond %{SCRIPT_FILENAME} !-f RewriteCond %{SCRIPT_FILENAME} !-d RewriteRule ^/?(.*)$ index.php/$1 [L]
我知道这与规则相互覆盖有关,但是我不确定,因为我对Apache的了解非常有限。 我怎么能解决这显然不是那么难的问题,我怎么能让我的.htaccess更紧凑和优雅?
非常感谢帮助,谢谢!
我必须这样回答,因为我的临时帐户(即cookie)丢失了。 无论如何,我发现了一些有趣的事情。
我已经解决了这个问题,你已经告诉了我关于REQUEST_URI的领先问题。
我在全局服务器configuration中input了RewriteLog和RewriteLogLevel指令(它应该适用于HTTP和HTTPS,对吧?)。
然后我发现,正如我在日志中看到的那样,所有的HTTP请求都得到了正确的处理,正如希望的那样(!),但是使用HTTPS的请求根本没有被logging! 所以我认为,无论是日志logging没有正确configuration或(我就是这么担心)通过HTTPS的请求甚至不通过mod_rewrite过程。
再次,我使用.htaccess文件来设置我的重写规则。
所以现在的实际问题是,HTTP上的所有内容都被正确地重写了,但是当我有https://myurl.org/shop这样的请求时,我希望它被redirect到http://myurl.org/因为它既不是admin.php也不是login.php。
而且我不明白这个部分“(根本不需要单独的RewriteCond)”。 谢谢!
在我更新的.htaccess文件下面。
RewriteEngine on RewriteCond %{HTTPS} on RewriteCond %{REQUEST_URI} !^/(admin\.php$|login\.php$) RewriteRule ^(.*)$ http://%{HTTP_HOST}${REQUEST_URI} [R=301,L] RewriteCond %{HTTPS} off RewriteCond %{REQUEST_URI} ^/(admin\.php$|login\.php$) RewriteRule ^(.*)$ https://myurl.org%{REQUEST_URI} [R=301,L] RewriteCond %{REQUEST_URI} !^/(index\.php$) RewriteCond %{SCRIPT_FILENAME} !-f RewriteCond %{SCRIPT_FILENAME} !-d RewriteRule ^/?(.*)$ index.php/$1 [L]