RewriteRule不起作用。 403错误

时间:2014-09-30 10:42:33

标签: php apache .htaccess mod-rewrite

我试图阻止访问我所有目录中的所有.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.

2 个答案:

答案 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

只需删除//条评论即可。他们不是有效的评论。