3

我有一个.htaccess文件,它将任何扩展名重定向到非扩展名 url 并显示请求的文件名 + .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>
4

2 回答 2

5

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

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

The [^.]part makes sure the (.*)\. matches everything until the last ., "positioning" the negative lookahead at the right spot.

于 2013-03-04T13:28:41.040 回答
0

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

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

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

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

ETC...

于 2013-03-04T13:11:19.220 回答