.htaccess 访问包含空格的URL/文件名|Apache|htaccess

k0pti3hp  于 2023-05-18  发布在  Apache
关注(0)|答案(3)|浏览(180)

根文件夹结构

Root .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文件夹内

公用文件夹中的.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]

我的问题

我无法访问文件p 1.jpg,如:

http://example.local/p%201.jpg

但如果我按如下方式改变它就可以工作

http://example.local/public/p%201.jpg

此外,如果有p.jpg,我可以访问http://example.local/p.jpg-没有任何问题。

a14dhokn

a14dhokn1#

这似乎是一个问题:

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

由于BCTLS标志只转义控制字符和空格字符。
从你的例子中可以看出,你想要处理所有的URL,因为你从客户端接收到的URL,所以你可以只用途:

RewriteRule .* public/$0 [L]
1mrurvl1

1mrurvl12#

从评论…
我可以用URL example.local/ws/getPost/mmm访问我的MVC PHP应用程序,但不能用如下的example.local/ws/getPost/mm%20m即使两个URL都是有效的,第二个显示禁止
这是一个不同的问题,一个例子,你张贴在你的问题。在你的问题中,p 1.jpg(大概)在第一次重写后直接Map到一个物理文件(即/public/p 1.jpg)。
然而,在第二个示例中,URL被/public/.htaccess文件中的规则(下面)进一步重写,因为它没有Map到物理文件:

:
RewriteRule ^(.*)$ ?q=$1 [QSA,L]

尝试添加B标志(或者 * BCTLS,如果在Apache 2.4.57+上使用 * 可能 * BCTLS),以便在传递给查询字符串时重新编码反向引用(捕获的URL路径)中的 space。(RewriteRule * 模式 * 匹配的URL路径是URL解码的。
您还应该直接重写到处理请求的文件(例如。index.php?)。目前,您依赖于DirectoryIndex(它需要一个额外的子请求),并且在这里没有明确定义,因此其他开发人员不清楚其意图是什么。
例如:

:
RewriteRule (.*) index.php?q=$1 [B,QSA,L]

(我最初 * 假设 * index.py,因为父.htaccess文件中有AddHandler指令,但从您后来的评论来看,这似乎是一个“PHP应用程序”。
进一步参考:

cotxawn7

cotxawn73#

谢谢你们
我通过更正公用文件夹中的htaccess解决了我的整个问题,如下所示

RewriteRule ^(.*)$ ?q=$1 [BCTLS,L]

使用Apache 2.4.57

相关问题