Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 重写规则不';t排除现有文件/目录_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

Apache 重写规则不';t排除现有文件/目录

Apache 重写规则不';t排除现有文件/目录,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,因此,对于一个网站,我的根目录中有一个index.php文件,它需要url参数来确定要回送的内容: example.com/?p=home example.com/?p=blog 但是,出于美观的目的,我在根目录的.htaccess文件中编写了一个重写规则,该规则使用URL参数将以下请求重定向到根目录中的index.php: example.com/home → example.com/?p=home example.com/blog/ → example.com/?p=blog 规则如下所

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

example.com/?p=home
example.com/?p=blog
但是,出于美观的目的,我在根目录的.htaccess文件中编写了一个重写规则,该规则使用URL参数将以下请求重定向到根目录中的index.php:

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]
但是,如果使用此选项,则不会加载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
,我相信这是由于您的规则中使用了regex模式。试试这些规则:

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的
部分添加

你能在Chrome开发工具->网络选项卡中查看你的页面,看看css/JSURL实际生成了什么吗?我添加了一些信息!希望这有帮助。所以文件夹
blog
不存在?但是文件夹
pics
project
等是否存在?你能共享现有的文件夹结构吗?2%{REQUEST_URI}是一个以斜杠开头的变量,如
/index.html
第一次重写时没有考虑到的内容。顺便问一下,cms是什么?出于同样的原因(
%{REQUEST\u URI}
),我看不到最后一次重写的目的…当然。文件夹“blog”不存在。确实存在的子目录是第一个重写条件中列出的子目录。顺便说一句,我试着在目录名之前用斜杠重写cond,但也没有成功。我的CSS和JS文件在项目文件夹中。我用。最后一秒的重写对我来说也很奇怪,但我不想碰它,因为最坏的情况是,它不会起任何作用。我只是尝试了一下,结果是一样的。example.com/blog工作正常,example.com/blog/没有加载CSS文件:(那么你肯定在使用一些相关链接。在HTML的
部分添加
。现在试试我更新的规则。特别是
重写规则^([a-z]+)/?$index.php?p=$1[NC,L,QSA]
我不能将规则用于[L]标记,因为我需要后一个规则来触发cms。cms的工作方式是将对index.php的请求重定向到cms_worker.php skcript,它将原始请求作为url参数,运行它,并用一些预定义的内容块替换关键字。元素不工作,但它工作了!!最后…抱歉,我没有看到任何内容在网络选项卡中,因为我在加载页面后打开了开发工具,所以我不知道这一点。因此,我使用了您更新的规则,并将基本url设置为
/
(以前不起作用,因为我智能地将
标记放在标记之后。现在我觉得自己很愚蠢(╯°□°)╯︵ ┻━┻ 非常感谢你!