You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让.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

火山引擎 最新活动