2017-10-10 128 views
1

我正在尝试在我的.htaccess中编写一个重写规则,将除一个域之外的所有流量重定向到https。然后,如果它正在尝试去的文件不存在,则运行后面的最后一个块,转到loader.php,但是如果文件存在,请转到该文件。htaccess重写规则,如果文件存在,否则转到PHP文件

这里是我到目前为止迭代之一:

RewriteEngine on 
RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} !^(www\.)?(korle\.tt) [NC] 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301] 
<If "-f %{DOCUMENT_ROOT} . '/'"> 
    RewriteEngine On 
    RewriteBase/
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^.*$ /loader.php [L] 
</If> 
<Else> 
    RewriteEngine On 
    RewriteRule^/404.html [R=404,L] 
</Else> 

我所试图做的,如果用户去korlett.orgkorlett.netkorelett.com或内的任何文件,它重定向到https://。但不是http://korle.tt或指向此目录的其他域(现在未指定),它们将保留HTTP。

然后在此之后,如果该文件不存在,或者如果该URL返回一个404,然后运行这个命令:

RewriteEngine On 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^.*$ /loader.php [L] 
+1

什么是 tadman

+0

@tadman我这么认为,但有人建议我这样做来检查文件是否返回404 /未找到。但是,当我尝试验证文件时,它说这不是有效的语法(在If)。所以我想这不重要,如果它的作品。有什么建议么? – wordSmith

+1

'RewriteCond'指令本身就是一种'if'。其他的东西就在这里。 – tadman

回答

1

那么,如果不把它交给loader.php检查是否还有很长url与该片段/“dir”配对,如果失败则提供404页面。

这404响应将需要管理loader.php - 即。在你的PHP脚本中。因为一旦请求传递到loader.php(任何请求没有映射到文件或目录),那么.htaccess已经有效地完成了请求,并且您不能再让Apache处理404响应。

它应该成为一个404如果loader.php没有找到

然而,这的确可以.htaccess进行管理,通过在RewriteRule替代设置的ErrorDocument和消除斜线前缀(无论如何,这可能是有意的,因为你已经包含了一个RewriteBase指令)。删除斜杠前缀可防止重写循环(从反复重写到loader.php)。换句话说,而不是这样的:

RewriteRule ^.*$ /loader.php [L] 

它应该是这样的:

RewriteRule^loader.php [L] 

正则表达式^具有相同的最终结果如本例^.*$,并简单地提供了相匹配任何(就像您在HTTP中进行HTTPS重定向一样)。

这可以防止重写循环,因为当重写为loader.php(相对路径,无斜杠前缀)时,重写引擎会检测到您正在重写到相同的URL并阻止进一步的重写。允许服务Apache 404 ErrorDocument。 (而/loader.php在技术上是一个不同的URL - 就mod_rewrite而言 - 因此重写将继续。)

所以,你完全.htaccess文件就变成了:

ErrorDocument 404 /404.html 

RewriteEngine on 
RewriteBase/

RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} !^(www\.)?(korle\.tt) [NC] 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule^loader.php [L] 

的另一种方式,以防止重写环是包括loader.php特定异常。事实上,这可以与上述一起使用,以便尽早使重写失败,而不是等待重写引擎检测到不变。例如,将上面的最后一个块更改为:

RewriteRule ^loader\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule^loader.php [L] 
+0

''ErrorDocument 404'永远不会被调用。 – anubhava

+1

@anubhava'ErrorDocument 404'只适用于'loader.php'本身不存在的情况。提供了避免重写循环的措施,在这种情况下,自定义错误文档确实看起来服务正常。 (一种双重目的的'.htaccess'文件看起来像这样 - 虽然这些指令应该可以被删除,如果'loader.php'不存在,但我想这样可以避免编辑'.htaccess'文件?) – MrWhite