javascript - .htaccess:使用 RewriteCond 但对 IMAGES/JS/CSS 文件的 href 仍然被不必要地重写

标签 javascript php css .htaccess mod-rewrite

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

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ index.php?lang=$1&menu1=$2&menu2=$3 [QSA,NC,L]
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?lang=$1&menu1=$2 [QSA,NC,L]
RewriteRule ^([^/]+)/?$ index.php?lang=$1 [QSA,NC,L]

结果是 PHP 页面 index.php 始终运行良好(其重写工作正常)。现在,我认为这些行是:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

这意味着,如果我们提供 PHP 文件以外的文件或目录,则不处理 RewriteRule。我错了吗?为什么这两行不起作用?

我尝试添加以下行:

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

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

最佳答案

您的问题是您只包含重写条件一次。重写条件仅适用于紧随其后的RewriteRule。因此,您需要每个 RewriteRule 的条件。请注意下面的区别。

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 规则,并通过在顶部添加规则来完成相同的操作,这样如果请求的文件是真实文件真实目录 不执行任何操作,否则继续进行下面的重写。

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不支持QSAL标志。这是针对 RewriteRule 的。

关于javascript - .htaccess:使用 RewriteCond 但对 IMAGES/JS/CSS 文件的 href 仍然被不必要地重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32437817/

相关文章:

javascript - 如何通过 JS 嵌入代码嵌入 HTML

php/js - 如何在页面卸载时删除文件?

html - 将 "?v=1"附加到链接和脚本标记中的 CSS 和 JavaScript URL 有什么作用?

html - 将值从 HTML 传递到 SCSS

javascript - ERR_SSL_VERSION_OR_CIPHER_MISMATCH Node v7.9.0 https

Javascript promise 不会通过 async/await 返回

javascript - 添加 div 被删除时的效果

php - 具有未知数量参数的方法可以调用另一个具有未知数量参数的方法吗?

php - $(document).ready() 什么时候触发?

javascript - CSS - 在打印中设置当前页的结尾