如何从Mod ReWrite Rules中排除网站的某些部分

时间:2014-11-10 21:46:33

标签: mod-rewrite

我正在从网站移动大多数页面,我想将所有请求重定向到404错误页面,除了网站上某个cname中的所有/任何页面,网站上某个子目录中的所有/任何页面,网站上某个目录中的某个页面。

这是我到目前为止所做的:

Options +FollowSymlinks
RewriteEngine On
RewriteCond %{HTTP_HOST} !^blogs.example.com [NC]
RewriteCond %{REQUEST_URI} !^/private [NC]
RewriteCond %{REQUEST_URI} !^/public/special-form.php [NC]
RewriteCond %{REQUEST_URI} !^/public/special-form_submitted.php [NC]
RewriteCond %{REQUEST_URI} !^/error404.php [NC]
RewriteRule ^(.*) http://example.com/error404.php [R=301,L]

1 个答案:

答案 0 :(得分:1)

您的问题主要是/开头的RewriteRule,为什么?

因为您正在使用.htaccess,因此RewriteRule路径在开头没有/的情况下开始。

如果它在VirtualHost内,那么就可以了。


基本上,这是您的规则告诉服务器在我们的评论对话和您的更新之后要做的事情:

Options +FollowSymlinks
RewriteEngine On

# if domain is not blogs.example.com
RewriteCond %{HTTP_HOST} !^blogs.example.com [NC]
# and if address does not start with /private 
RewriteCond %{REQUEST_URI} !^/private [NC]
# and if the file is not /public/special-form.php
RewriteCond %{REQUEST_URI} !^/public/special-form.php [NC]
# and if the file is not /public/special-form_submitted.php
RewriteCond %{REQUEST_URI} !^/public/special-form_submitted.php [NC]
# and if the file is not /error404.php
RewriteCond %{REQUEST_URI} !^/error404.php [NC]
# then redirect to http://example.com/error404.php
RewriteRule ^ http://example.com/error404.php [R=301,L]

所以其他任何东西,包括图像或css或未列出的条件都会被重定向,以避免你必须验证这2个php页面中的所有所需文件和白名单,例如条件如这样:

RewriteCond %{REQUEST_URI} !^/public/[^.]+\.(css|pdf|jpg|doc)$ [NC]

基本上,上述内容表示公共文件夹中以.css.pdf.doc.jpg结尾的任何内容均应显示。

注意:请注意,如果您的图片和文档以及您需要从这2个PHP页面向用户显示的任何其他内容不在公共文件夹中,则上述操作无效,这仅仅是一个示例,说明将多种类型的文件耦合到其中的简单方法。


你也可以恢复这两个条件:

RewriteCond %{REQUEST_URI} !^/public/special-form.php [NC]
RewriteCond %{REQUEST_URI} !^/public/special-form_submitted.php [NC]

如下:

RewriteCond %{REQUEST_URI} !^/public/(special-form_submitted|special-form)\.php [NC]

你会以:

结束
Options +FollowSymlinks
RewriteEngine On

RewriteCond %{HTTP_HOST} !^blogs.example.com [NC]
RewriteCond %{REQUEST_URI} !^/private [NC]
RewriteCond %{REQUEST_URI} !^/public/(special-form_submitted|special-form)\.php [NC]
RewriteCond %{REQUEST_URI} !^/public/[^.]+\.(css|pdf|jpg|doc)$ [NC]
RewriteCond %{REQUEST_URI} !^/error404.php [NC]
RewriteRule ^ http://example.com/error404.php [R=301,L]

只是一个辅助信息,因为您重新定向了与条件不符的任何内容,并且您没有将任何内容传递给重定向,您不需要(.*),仅仅使用^就可以完成这项工作。