RewriteRule不排除现有文件/目录

时间:2015-08-13 15:26:51

标签: apache .htaccess mod-rewrite

因此,对于一个网站,我的根目录中有一个index.php文件,该文件需要url参数来确定要回显的内容:

example.com/?p=home
example.com/?p=blog

但是,出于美学目的,我在根目录的.htaccess文件中编写了一个RewriteRule,它将以下请求重定向到根目录中的index.php,并带有URL参数:

example.com/home → example.com/?p=home
example.com/blog/ → example.com/?p=blog

规则如下:

RewriteEngine On

# This is my rule
RewriteCond %{REQUEST_URI} !^(bootstrap|cms|php|pics|project|install)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ([a-zA-Z]*)/?$ index.php?p=$1 [NC]

# The following rules are used by the CMS I'm using, so I don't want to change those
RewriteRule ^(cms)($|/) - [L]
RewriteRule ^(install)($|/) - [L]
RewriteCond %{REQUEST_URI}  !^(\.png|\.jpg|\.gif|\.jpeg|\.bmp)/$
RewriteRule (.*.html|.*.php|.*.htm)  cms_worker.php?page=$1 [QSA]

然而,使用这个我使用相对链接(例如<link href="/project/style.css" rel="stylesheet">)包含在index.php中的所有CSS和JS文件都没有加载,因为规则似乎也会影响这些请求。

为什么会这样?我该如何解决?我认为规则上方的重写条件应该阻止在请求的目录或文件存在时应用规则...我尝试添加第一个RewriteCond以从规则中排除对指定目录的请求,但这不起作用

修改:如果我访问页面没有结尾斜杠(即example.com/blog),它就可以了。但是,当我使用结尾斜杠(即example.com/blog/)访问页面时,未加载CSS和JS文件。 Chrome开发工具的网络标签没有显示任何内容,但是当我打开源代码并点击css文件的相对链接时,它会重定向到example.com/blog/project/style.css而不是example.com/project/style.css

1 个答案:

答案 0 :(得分:1)

我认为这是由于您的规则中使用的正则表达式模式。试试这些规则:

RewriteEngine On

# This is my rule
RewriteCond %{REQUEST_URI} !^(bootstrap|cms|php|pics|project|install)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-z]+)/?$ index.php?p=$1 [NC,L,QSA]

# The following rules are used by the CMS I'm using, so I don't want to change those
RewriteRule ^cms($|/) - [L,NC]

RewriteRule ^install($|/) - [L,NC]

RewriteRule ^(.+?\.(?:html?|php))$ cms_worker.php?page=$1 [QSA,L,NC]

要解析相对链接,请在HTML的<base href="/">部分添加<head>