你需要处理两件事。
<FilesMatch>
容器没有起到作用。你已经有了一个 Satisfy Any
。你应该把这些扩展名添加到单独的 SetEnvIfNoCase
中。
当你使用重写规则来重写 /upload/
时,你需要包括“友好”的 URI 和重写后的 URI,因为身份验证模块在每一步都被应用(显然,通过重写/别名绕过身份验证非常糟糕)。这意味着,例如,如果你有以下规则:
RewriteRule ^upload/(.*)$ /upload_script.php?file=$1 [L]
然后,您需要在
/upload/
和
/upload_script.php
这
两个路径中都添加一个NO_AUTH行:
SetEnvIfNoCase Request_URI ^/upload/ NO_AUTH
SetEnvIfNoCase Request_URI ^/upload_script.php NO_AUTH
然后针对问题#1:
SetEnvIfNoCase Request_URI \.(gif|jpe?g|png|css|js|swf)$ NO_AUTH
以下是建议的示例:
您可以尝试的一种方法是添加一条规则(类似于上面的 RewriteRule
示例),将 /upload/
路由到一个中间脚本,而不是 index.php
,然后从中间脚本调用 index.php
。
所以使用上面的 /upload_script.php
示例,在任何规则之前添加此内容:
RewriteRule ^upload/ /upload_script.php [L]
这段文字的英译中文为:
所以它看起来像:
RewriteEngine On
RewriteRule ^upload/ /upload_script.php [L]
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
接下来,您需要创建一个名为upload_script.php
的脚本,该脚本将包含以下内容:
<?php
include_once "index.php";
?>
您可能需要先转储$_SERVER['']
数组,以查看是否设置为Zend的index.php
所期望的内容。
RewriteRule
示例),将/upload/
路由到除index.php
之外的中间脚本,然后从中间脚本调用index.php
。 - Jon LinRewriteCond
和RewriteRule
。 我目前有以下代码:RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
您认为您能告诉我如何将您的建议与该代码混合使用吗? - Jeff