含空格的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文件夹中的.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
相关产品推荐
相关产品推荐

