【问题标题】:How to rewrite rule based on folder and file type in htaccess?如何根据htaccess中的文件夹和文件类型重写规则?
【发布时间】:2017-08-12 05:15:37
【问题描述】:

我一直在尝试为下载文件夹实施重写规则,以便我可以提供以 .gif、.jpg、.png、.css、.js 或 .swf 结尾的文件并将用户发送到 user.php其他所有文件。

例如:我应该点击这个网址:www.somewhere.com/downloads/mypic.jpg, 但是当我尝试时:www.somewhere.com/downloads/my.pdf 我应该被重定向到 user.php。

到目前为止,我有:

RewriteRule ^*/downloads//!(.*)\.(gif|jpg|png|jpeg|css|js|swf)$ /base/user.php?a=$1 [R=302,L]  

以下是一些预期行为示例:

www.somewhere.com/downloads/mypic.jpg

www.somewhere.com/downloads/otherpic.png

www.somewhere.com/downloads/scripts/jquery.js

不好

www.somewhere.com/downloads/my.pdf > 将请求发送到 www.somewhere.com/base/user.php

www.somewhere.com/downloads/readme.txt > 将请求发送到 www.somewhere.com/base/user.php

www.somewhere.com/downloads/postman.json > 将请求发送到 www.somewhere.com/base/user.php

【问题讨论】:

  • 需要更清楚。您要跳过所有*.pdf 文件还是只跳过my.pdf
  • 你想如何分隔两个 URL?是什么让第二个案例与第一个案例不同?您需要指定某种形式的逻辑...
  • @anubhava 我需要跳过所有 *.pdf 或任何其他不在 (...) 中的文件。
  • 您能否添加一些有问题的示例 URL 来告诉我们其中哪些应该路由到 /base/user.php

标签: .htaccess mod-rewrite url-rewriting


【解决方案1】:

这可能就是你要找的:

RewriteEngine on
RewriteRule ^/?downloads/([^/]+)\.(gif|jpg|png|jpeg|css|js|swf)$ /base/user.php?a=$1 [R=302]  

上述规则将重定向浏览器,因此更改可见 URL。这就是您在问题中建议自己的内容。如果您想实现 internal 重写,则需要稍微更改标志:

RewriteEngine on
RewriteRule ^/?downloads/([^/]+)\.(gif|jpg|png|jpeg|css|js|swf)$ /base/user.php?a=$1 [END]  

此规则适用于 http 服务器主机配置,同样适用于动态配置文件 (.htaccess)。显然,必须在您的 http 服务器中启用重写模块。如果您决定使用动态配置,则需要先启用其解释,请查看官方文档中的AllowOverride 指令。


还有一个一般提示:您应该始终喜欢将此类规则放在 http 服务器(虚拟)主机配置中,而不是使用动态配置文件(.htaccess 样式文件)。众所周知,这些文件容易出错,难以调试,而且它们确实会降低服务器的速度。它们仅在您无法控制主机配置(阅读:非常便宜的托管服务提供商)或您有一个依赖于编写自己的重写规则的应用程序(这显然是安全噩梦)的情况下作为最后一个选项被支持)。


在您对问题的修改中,很明显您尝试实施的实际上与您之前明显提出的相反。这是上述规则的修改版本:

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/downloads/[^/]+\.(gif|jpg|png|jpeg|css|js|swf)$
RewriteRule !^/?downloads/([^/]+\.\w+)$ /base/user.php?a=$1 [R=302]

还有一个一般性的评论:通常不授予任何对服务器端物理文件系统中文件的直接访问权限,而是实现一个路由器脚本来控制对所有此类文件的访问权限。这允许更细粒度的访问控制,并使物理布局与您定义的 URL 集分开。

【讨论】:

  • 我仍然可以点击下载下的​​ pdf 文件。如果我点击图像文件,这实际上是将我发送到 user.php。
  • @CFNinja 当然可以,因为规则被明确设计为来匹配此类文件。由于您的问题不清楚,并且您的附加评论无济于事,因此我尽可能地回答了最佳问题。所以也许你edit你的问题并真正尝试解释你真正想要的东西是有道理的。您所说的“跳过”和“命中”是什么意思。由于目前我们所能做的就是猜测。哦,还有...不要在 cmets 中添加其他信息,请使用问题下方的 edit 链接。
  • @CFNinja 我添加了一个修改后的规则集,它实现了一个条件。这样,只有在请求将模式与有效的文件扩展名匹配时,才会应用实际的重写规则。
  • 我现在迷路了。我可以点击图像文件、css、js 和 pdf 文件。我根本不应该点击 pdf 文件。仅允许使用列出扩展名的文件。
  • @CFNinja 那么您的规则集很可能根本没有得到应用。正如我在答案中指出的那样,您没有启用它,或者您在错误的位置使用了动态配置文件。
【解决方案2】:

downloads/.htaccess 文件中包含此规则(如果不存在则创建它):

RewriteEngine On

RewriteCond %{REQUEST_URI} !\.(gif|png|jpe?g|css|js|swf)$ [NC]
RewriteRule .* /base/user.php?a=$0 [R=302,L,NC,QSA]

【讨论】:

    【解决方案3】:

    当存在对禁止扩展的请求时,我决定重定向。这对我有用:

    RewriteRule ^/downloads/(..(pdf|txt|json))$ /base/user.php?a=$0 [R=302,L]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-16
      • 2012-11-22
      • 1970-01-01
      • 2012-02-24
      • 2016-03-30
      • 1970-01-01
      • 2012-08-20
      • 2014-12-20
      相关资源
      最近更新 更多