我试图阻止访问我所有目录中的所有.php
文件,但我需要保留一个文件,以便它可以处理用户请求,但我的RewriteRule无效。如何让它发挥作用?
这是我的.htaccess:
AddDefaultCharset utf-8
Options -MultiViews
Options +FollowSymLinks
Options All -Indexes
Order deny,allow
Deny from all
<Files ~ "\.(txt|xml|css|jpe?g|png|gif|js|pdf)$">
Allow from all
</Files>
<Files ~ "start\.php$">
Allow from all
</Files>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^/$ [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ /start.php [QSA]
现在,如果我想访问http://localhost/test
,则会显示403错误:You don't have permission to access /test on this server.
答案 0 :(得分:1)
对此的一个解决方案是将所有.php
文件移到文档根目录之外,并且只保留start.php
。这有效地阻止了对任何.php
文件的访问,除了您想要允许的文件。
另一个解决方案是基于配置,这更昂贵,因为Apache必须检查所请求的每个文件的规则。
拒绝访问http://localhost/test
,因为您有
Order deny,allow
Deny from all
并且Files
部分不适用于此处。有关详细信息,请参阅Order Directive
,尤其是您拥有的表格
Match Allow,Deny result Deny,Allow result --------------------------------------------------------- Match Deny only Request denied Request denied
如果您只想获得给定文件的Deny from all
,则必须将其移至FilesMatch
部分
<FilesMatch "\.php$">
Deny from all
</FilesMatch>
<FilesMatch "start\.php$">
Allow from all
</FilesMatch>
当然,您也可以使用Files
部分,但请注意旁注
&LT; FilesMatch&GT;但是,首选。
答案 1 :(得分:0)
这只是一个想法,我还没有测试过。我已删除所有deny/allow
规则。
AddDefaultCharset utf-8
Options -MultiViews
Options +FollowSymLinks
Options All -Indexes
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -f // the request is a file
RewriteCond $1 ^.+\.php$ // the requested file has php extension
RewriteCond $1 !^start\.php // and is not that start.php file (the one you will allow)
RewriteRule ^.*$ - [F,L] // forbid request
只需删除//
条评论即可。他们不是有效的评论。