Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.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
Javascript .htaccess:对图像/JS/CSS文件使用RewriteCond,但hrefs仍在不自觉地重写_Javascript_Php_Css_.htaccess_Mod Rewrite - Fatal编程技术网

Javascript .htaccess:对图像/JS/CSS文件使用RewriteCond,但hrefs仍在不自觉地重写

Javascript .htaccess:对图像/JS/CSS文件使用RewriteCond,但hrefs仍在不自觉地重写,javascript,php,css,.htaccess,mod-rewrite,Javascript,Php,Css,.htaccess,Mod Rewrite,概述如何使用RewriteCond正确提供图像、js和css文件。但是,这里是我的.htaccess文件(位于服务器根目录下的目录中,该目录始终包含在站点的http链接中)(请注意,我的问题可能与此相关,但实际上更具体): 结果是PHP页面index.PHP总是可以正常使用(重写工作正常)。现在,我认为这句话: RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d 也就是说,如果我们提供的是PHP文件以外

概述如何使用RewriteCond正确提供图像、js和css文件。但是,这里是我的.htaccess文件(位于服务器根目录下的目录中,该目录始终包含在站点的http链接中)(请注意,我的问题可能与此相关,但实际上更具体):

结果是PHP页面index.PHP总是可以正常使用(重写工作正常)。现在,我认为这句话:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
也就是说,如果我们提供的是PHP文件以外的文件或目录,那么就不要处理重写规则。我错了吗?为什么这两条线不起作用

我已经尝试过在下面的行前加上前缀:

RewriteCond %{REQUEST_URI} !\.(gif|jpg|png|ico|css|js)$ [QSA,NC,L]

但是它不起作用(当我试图检索根文档时,我得到一个HTTP 500内部服务器错误)。

您的问题是您只包含了一次重写条件。重写条件仅适用于紧跟在条件之后的
重写规则
。因此,您需要为每个
重写规则
设置条件。注意下面的区别

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ index.php?lang=$1&menu1=$2&menu2=$3 [QSA,NC,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?lang=$1&menu1=$2 [QSA,NC,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/?$ index.php?lang=$1 [QSA,NC,L]
现在,如果您想保存一些代码行,您也可以用这种方式编写.htaccess规则,并通过在顶部添加规则来完成同样的任务,这样,如果请求的文件是
real文件
real目录
,则不执行任何操作,否则继续进行下面的重写

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.* - [L]

RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ index.php?lang=$1&menu1=$2&menu3=$3 [QSA,NC,L]
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?lang=$1&menu1=$2 [QSA,NC,L]
RewriteRule ^([^/]+)/?$ index.php?lang=$1 [QSA,NC,L]
另外,供参考,您在这条线上得到500错误的原因

RewriteCond %{REQUEST_URI} !\.(gif|jpg|png|ico|css|js)$ [QSA,NC,L]

是因为
RewriteCond
不支持
QSA
L
标志。这是为
RewriteRule

写的,它不只是对样式表和图像的相对资源引用吗?或者你的日志表明请求路径被重写了吗?但是你正在提供一个php文件。。。它被称为
index.php
,至少是.htaccess代码所显示的。有什么问题吗?是的,我提供的是一个index.php文件,它包含或引用了所有其他文件:php文件引用了/css/style.cs和js/jquery.js文件,但这些文件正在被重写,我不知道.htaccess文件中的前两个重写代码在做什么,以及我是否需要它们,到目前为止,他们似乎没有带来任何不同。谢谢。我想你的问题还没有结束。谢谢你的回答。这就解决了问题。出于好奇,您包含的第二个代码段中重写规则中的[OR]标志和-(破折号)是做什么的?由于您发布的第一个代码片段实际上解决了我的问题,我想我不需要这样的代码,但也许您可以在您发布的第二个代码片段中解释一下这些代码的作用。@Johnson Derson请接受答案,因为它解决了您的问题。现在,
标志就是这样。这意味着如果第一个条件匹配
第二个条件匹配,则执行以下重写规则。破折号上写着规则什么也不做。所以它基本上就停在那里。第二段代码更少,我更喜欢,但如果您正在学习mod_rewrite,第一段可能更容易理解。谢谢。我现在明白了。但是[或]无论如何都不成立。毕竟,通用文件是文件或目录(不能两者兼而有之)。这就是让我困惑的地方。如果没有这两个指令,就肯定不能执行AND。一旦我理解了这个问题,我就会接受。@JohnSonderson接受和回答并不是完全理解某件事情是如何运作的。我修复了您遇到问题的代码。:)不真正了解如何或如何工作并不完全在范围之内,因为这将成为一种培训情况。请看一下下至底部的卷轴#6,它给出了一个很好的解释,希望它更清晰。
RewriteCond %{REQUEST_URI} !\.(gif|jpg|png|ico|css|js)$ [QSA,NC,L]