.htaccess 如何根据htaccess中的文件夹和文件类型重写规则?

.htaccess 如何根据htaccess中的文件夹和文件类型重写规则?,.htaccess,mod-rewrite,url-rewriting,.htaccess,Mod Rewrite,Url Rewriting,我一直在尝试为下载文件夹实现重写规则,这样我就可以为以.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|j

我一直在尝试为下载文件夹实现重写规则,这样我就可以为以.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

这可能就是您想要的:

RewriteEngine on
RewriteRule ^/?downloads/([^/]+)\.(gif|jpg|png|jpeg|css|js|swf)$ /base/user.php?a=$1 [R=302]  
上述规则将重定向浏览器,因此请更改可见URL。这就是你在问题中提出的建议。如果您想实现内部重写,则需要稍微更改标志:

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集分离

这可能就是您想要的:

RewriteEngine on
RewriteRule ^/?downloads/([^/]+)\.(gif|jpg|png|jpeg|css|js|swf)$ /base/user.php?a=$1 [R=302]  
上述规则将重定向浏览器,因此请更改可见URL。这就是你在问题中提出的建议。如果您想实现内部重写,则需要稍微更改标志:

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集分离

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


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


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


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

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


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

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