【问题标题】:.htacess to perform rewrite if file does not exist.htaccess 如果文件不存在则执行重写
【发布时间】:2017-10-11 02:40:32
【问题描述】:

我有两个单独的 .htaccess 文件,我想将它们融合在一起,以便第一次重写始终优先,这会将一些流量重定向到 https 基础哪个域。然后,如果 url 处的文件不存在,则将流量发送到 php 文件。它是一个 url 缩短器,但如果返回 404,那么它会显示一个 404 错误页面。

以下是 .htaccess 文件的点点滴滴:

下面,我认为应该将除 kore.tt 和 korett.com 之外的所有 http 流量重定向到 https:

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

这是来自 url 缩短器的东西,它应该向 loader.php 发送不存在的流量

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /loader.php [L]
</IfModule>

但是如果返回 404 错误。那么这就是简单的 404 错误捕获。

ErrorDocument 404 /404.html

【问题讨论】:

  • 您的ErrorDocument 404 永远不会执行,因为您的重写规则将所有非文件和非目录转发到loader.php

标签: .htaccess redirect mod-rewrite


【解决方案1】:

您可以在 htaccess 中使用条件。创建规则的方法还有很多。看看这是否适合你。

  #check to see if loader.php exists on the filesystem, then do rewrite
  <If "-f %{DOCUMENT_ROOT} . '/loader.php'">
     RewriteEngine On
     RewriteBase /
     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteCond %{REQUEST_FILENAME} !-d
     RewriteRule ^.*$ /loader.php [L]
  </If>
   #otherwise redirect to 404 page
  <Else>
     RewriteEngine On
     RewriteRule ^ /404.html [R=404,L]
  </Else>

【讨论】:

  • 但是当 URL 缩短器(即loader.php)找不到文件时,OP 希望返回 404 页面。 (这需要从 loader.php 生成,而不是在 .htaccess 中生成。)如果您只是希望在 loader.php 不存在时返回 404 ErrorDocument,那么您不必做任何事情 - OP代码应该按原样工作。
  • 可能被误解了。他的措辞方式我认为如果 loader.php 不存在则执行 404。我没有测试代码,但它似乎会创建一个重定向循环,因为重写将不存在的文件重定向到如果 loader.php 丢失,则文件不存在。
  • 啊,是的,如果/loader.php 不存在,您对使用 OP 代码的重写循环是正确的。但是,在本例中,只需删除RewriteRule susbstitution 上的斜杠前缀,就可以避免这种重写循环。 IE。 loader.php 而不是 /loader.php。然后 mod_rewrite 能够检测到请求正在被自己重写并阻止进一步的重写,从而允许提供错误文档。
猜你喜欢
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多