如何让.htaccess的RewriteRule仅作用于logout.php而非logout.png?
搞定.htaccess重写规则误触发静态资源的问题
哎呀这个坑我之前也踩过!你现在的问题就是Rewrite规则没做「边界限制」,把像logout.png这种静态图片也当成要处理的PHP页面了,服务器误打误撞触发了logout.php的登出逻辑。
其实只需要给你的重写规则加几个判断条件,就能精准让规则只作用于PHP页面,完全不碰静态资源。下面给你两种靠谱的修改方案:
方案一:排除所有已存在的文件/目录(推荐)
这种方法最通用,不管你是图片、CSS还是JS,只要是服务器上实际存在的文件,都不会被重写规则影响。修改后的.htaccess代码如下:
RewriteEngine On # 先判断:如果请求的不是已存在的文件 RewriteCond %{REQUEST_FILENAME} !-f # 再判断:如果请求的不是已存在的目录 RewriteCond %{REQUEST_FILENAME} !-d # 最后执行重写:把不带.php的请求转成对应PHP文件(比如 logout → logout.php) RewriteRule ^([^\.]+)$ $1.php [NC,L]
为啥这能行?
!-f是告诉服务器:只有当请求的文件不存在时,才执行后面的重写规则。logout.png是实际存在的图片,所以直接返回,不会触发任何重写。!-d同理,排除掉已存在的目录请求,避免不必要的重写。^([^\.]+)$这个正则专门匹配不带点的路径,确保只有像logout这种没有后缀的请求才会被转成logout.php,从根源上避免带后缀的静态资源被误匹配。
方案二:指定排除特定后缀的静态资源
如果你想更精准地控制哪些类型的文件不被重写,可以直接列出要排除的后缀,比如图片、CSS、JS这些:
RewriteEngine On # 排除图片、CSS、JS等常见静态资源后缀(可按需添加) RewriteCond %{REQUEST_URI} !\.(png|jpg|jpeg|css|js|gif|svg)$ [NC] # 同样排除已存在的文件和目录 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 执行重写规则 RewriteRule ^(.*)$ $1.php [NC,L]
这种写法的好处是,你可以根据自己的业务需求灵活添加要排除的文件类型,比如如果有字体文件,就加上|woff2|ttf就行。
现在去测试一下:访问logout会正常触发logout.php的登出逻辑,而加载logout.png时,服务器会直接返回图片,再也不会误触发登出啦!
内容的提问来源于stack exchange,提问作者SystemX17




