【发布时间】:2014-01-11 23:04:55
【问题描述】:
我正在(学习)实现前端控制器模式,将所有请求重定向到 index.php 并通过 httpd.conf 中的 mod_rewrite 规则附加为查询字符串(稍后由 PHP 解析),如下所示:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php/$1 [NC,L]
问题 1: 这也是重定向所需的现有文件,例如 domain.com/css/main.css。 !-d 和 !-f 不应该阻止这种情况吗?
问题 2: 我想阻止对某些目录及其内容的访问 (403) -- domain.com/css/*、domain.com/js/* 等 -- 除非请求来自 domain.com。
博览会
我有以下规则来阻止基于HTTP_REFERER 的请求(来自博客,找不到链接...),它本身会阻止所有用户请求:
RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} !^([^@]*)@@https?://\1/.*
RewriteRule ^.*$ - [F]
我想添加另一个条件,检查 REQUEST_URI 是否适用于这些目录中的任何内容,但无法使其正常工作。如果我添加以下内容:
RewriteCond %{REQUEST_URI} /?.*(css|js)/?.* [NC]
然后一切被重定向;没有它,一切都会被阻止。所以,完整的 mod_rewrite 集如下:
RewriteCond %{REQUEST_URI} /?.*(css|js)/?.* [NC]
RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} !^([^@]*)@@https?://\1/.*
RewriteRule ^.*$ - [F]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php/$1 [NC,L]
我们将不胜感激任何帮助;我整天都在寻找答案。
【问题讨论】:
标签: php regex apache mod-rewrite