13

我在站点的子目录中有以下 .htaccess 文件,该文件允许我将所有 URL 路由到 index.php 以解析它们。

但是,它不允许我需要网站的标准文件,例如 css、javascript、pngs 等。

我需要改变什么(我假设在第四行)以允许这些文件,这样它们就不会被路由到 index.php?

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|public|css|js|png|jpg|gif|robots\.txt)
RewriteRule ^(.*)$ index.php/params=$1 [L,QSA]
ErrorDocument 404 /index.php
4

4 回答 4

13

我注意到了什么。您使用的是正斜杠而不是问号...参数重定向通常如下所示:

RewriteRule ^(.*)$ index.php?params=$1 [L,QSA]

这应该可以自己工作,因为这些文件中的任何一个*应该*是真实文件。

ErrorDocument 404 /index.php    

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?params=$1 [L,QSA]

要让站点忽略特定扩展名,您可以添加一个条件来忽略大小写,并且只检查请求中文件名的结尾:

RewriteEngine On

RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?params=$1 [L,QSA]

如果您尝试忽略文件夹,则可以添加:

RewriteEngine On

RewriteCond %{REQUEST_URI} !(public|css)
RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?params=$1 [L,QSA]
于 2013-06-10T17:51:18.717 回答
7

最简单的方法是在规则的早期明确忽略它们:

RewriteRule \.(css|js|png|jpg|gif)$ - [L]
RewriteRule ^(index\.php|robots\.txt)$ - [L]

这样可以避免使用 RewriteCond 将它们带到任何地方。

根据您的选择,在执行此操作之前检查文件是否存在:

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule \.(css|js|png|jpg|gif)$ - [L]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(index\.php|robots\.txt)$ - [L]

(请注意,文件检查会产生额外的磁盘访问。)

于 2013-06-10T16:11:39.697 回答
1

你有正确的想法,调整第四行。这^就是说各种匹配的字符串必须在行首。如果您不关心这些文件中出现的位置,您只需删除^. 这将避免重写 *.css、*.js 等;但也不会重写publicideas.html。

如果您想仅限于后缀,请尝试以下操作:

RewriteCond $1 !^(index\.php|public|.*\.css|.*\.js|.*\.png|.*\.jpg|.*\.gif|robots\.txt)$

这表示要在开头匹配任何内容,然后是 a .,然后是后缀。说最后$匹配这些(没有下文)。

我不确定public,所以我留下了它(这意味着完全公开,没有别的 - 可能不是你的意思,但你可以添加*之前或之后,或两者兼而有之)。

于 2013-06-10T16:06:17.643 回答
0

RewriteCond %{REQUEST_FILENAME} !-f一个人应该就够了。

另一种选择是不从重写中排除特定文件。从 TYPO3 包中:

# Stop rewrite processing, if we are in the typo3/ directory.
# For httpd.conf, use this line instead of the next one:
# RewriteRule ^/TYPO3root/(typo3/|t3lib/|fileadmin/|typo3conf/|typo3temp/|uploads/|favicon\.ico) - [L]
RewriteRule ^(typo3/|t3lib/|fileadmin/|typo3conf/|typo3temp/|uploads/|favicon\.ico) - [L]

此规则应出现在您实际重写之前。它应该是

RewriteRule ^(public/|*\.css|*\.js|*\.png|*\.jpg|*\.gif|robots\.txt) - [L]

在你的情况下。

于 2013-06-10T16:07:51.370 回答