根文件夹结构
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
-没有任何问题。
3条答案
按热度按时间a14dhokn1#
这似乎是一个问题:
由于
BCTLS
标志只转义控制字符和空格字符。从你的例子中可以看出,你想要处理所有的URL,因为你从客户端接收到的URL,所以你可以只用途:
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到物理文件:尝试添加
B
标志(或者 *BCTLS
,如果在Apache 2.4.57+上使用 * 可能 *BCTLS
),以便在传递给查询字符串时重新编码反向引用(捕获的URL路径)中的 space。(RewriteRule
* 模式 * 匹配的URL路径是URL解码的。您还应该直接重写到处理请求的文件(例如。
index.php
?)。目前,您依赖于DirectoryIndex
(它需要一个额外的子请求),并且在这里没有明确定义,因此其他开发人员不清楚其意图是什么。例如:
(我最初 * 假设 *
index.py
,因为父.htaccess
文件中有AddHandler
指令,但从您后来的评论来看,这似乎是一个“PHP应用程序”。进一步参考:
cotxawn73#
谢谢你们
我通过更正公用文件夹中的htaccess解决了我的整个问题,如下所示
使用Apache 2.4.57