.htaccess 重定向除 css 和 javascript 之外的所有扩展

Posted

技术标签:

【中文标题】.htaccess 重定向除 css 和 javascript 之外的所有扩展【英文标题】:.htaccess redirect all extension except css and javascript 【发布时间】:2013-02-18 14:03:39 【问题描述】:

我有一个 .htaccess 文件,它将任何扩展名重定向到非扩展名 url 并显示 requestedfilename + .php。它适用于条件的 (.*) 部分。

当我输入 domain.com/file.htmldomain.com/file.xml 时,它会显示 file.php 和url 看起来像 domain.com/file

我只是想知道如何从表达式中排除 .js 和 .css 之类的扩展名。我不想将它们重定向到任何其他 php 文件。

我尝试了类似:(.*!.(js|css)) 而不是 (.*) 但我找不到有效的解决方案.. .

目前的代码是这样的:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

#
# to display the name.php file for any requested extension (.*)
#
RewriteRule ^(.*)\.(.*) $1\.php

#
# to hide all type of extensions (.*) of urls
#
RewriteCond %THE_REQUEST ^[A-Z]+\s.+\.(.*)\sHTTP/.+
RewriteRule ^(.+)\.php $1 [R=301,L]

#
# no extension url to php
#
RewriteCond %REQUEST_FILENAME.php -f
RewriteCond %REQUEST_URI !/$
RewriteRule (.*) $1\.php [L]

</IfModule>

【问题讨论】:

【参考方案1】:

如果您的 Apache 版本支持它,您可以使用“负前瞻”并像这样编写第一个 RewriteRule:

RewriteRule ^(.*)\.(?!js|css)([^.]*)$ $1\.php

[^.]part 确保 (.*)\. 匹配直到最后一个 . 之前的所有内容,将负前瞻“定位”在正确的位置。

【讨论】:

正是我想要的!谢谢!【参考方案2】:

重定向的主要思想是转发一些不存在的东西,所以重定向只有在请求的 url 不存在时才会起作用。如果您有一个http://mysite.com/js/script.js 文件,它将始终像正常文件一样打开该文件。

因此,在您的情况下,如果 css 和 js 文件确实存在,则不需要特定的重定向。

您可能需要做的是指出这些文件的完整路径。例如:

http://mysite.com/js/script.js(工作) /js/script.js(有效) js/script.js(如果您在不同的重定向目录下,则将失败)

等等……

【讨论】:

好吧,如果你愿意,你当然可以强制重定向,即使文件或目录存在。这就是 -d-f 的用途。 是的,我只是在评论“它总是会像普通文件一样打开该文件”,但事实并非如此。

以上是关于.htaccess 重定向除 css 和 javascript 之外的所有扩展的主要内容,如果未能解决你的问题,请参考以下文章

通过 httpd.conf / htaccess 重定向目录中除一个文件之外的所有文件

php中htaccess重定向url后无法加载css和js

使用 .htaccess 重定向时丢失 CSS

配置 htaccess 以直接访问 CSS 和 JS 文件,但将所有其他请求重定向到索引文件 [重复]

htaccess directoryindex重定向寻找css错误的地方

.htaccess 基于 SSL 协议的重定向