You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含空格的Access URL/文件名无法访问 | Apache htaccess问题

问题分析与解决

根目录结构

根目录结构

根目录.htaccess

Options -Indexes
Options +FollowSymLinks
Options +ExecCGI
AddHandler cgi-script .cgi .pl .py

RewriteEngine on
RewriteRule ^(.*)$ public/$1 [BCTLS]

php_value file_uploads 1
php_value memory_limit 1024M
php_value post_max_size 1024M
php_value upload_max_filesize 1024M

public文件夹内结构

public文件夹结构

public文件夹中的.htaccess

Options -Indexes

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-s 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_URI} !=/robots.txt
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ ?q=$1 [QSA,L]

问题描述

无法通过地址 http://example.local/p%201.jpg 访问文件 p 1.jpg,但直接访问 http://example.local/public/p%201.jpg 可以正常打开。另外,无空格的文件 p.jpg 能通过 http://example.local/p.jpg 正常访问。


解决方法

问题出在根目录.htaccess里RewriteRule的[BCTLS]标志中的B(转义反向引用)。

当请求p%201.jpg时,Apache会先把%20解码为实际空格,此时RewriteRule的^(.*)$匹配到带空格的字符串p 1.jpg。而B标志会把这个空格重新转义为%20,导致重写后的路径变成public/p%201.jpg——服务器会把这个路径当作带%20字符的文件名去查找,而非实际带空格的文件,自然无法找到。

修改根目录的RewriteRule,去掉B标志,保留必要的L(最后规则)即可:

RewriteRule ^(.*)$ public/$1 [L]

如果需要保留原规则中其他有效标志(比如C、T等,若确有业务需要),仅移除B即可,示例:

RewriteRule ^(.*)$ public/$1 [CTLS]

修改后,带空格的文件就能通过根目录的URL正常访问了。

内容的提问来源于stack exchange,提问作者RethNath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 00:15:07