.htaccess根据查询字符串将URL重写为未编译的文件版本(如果存在)

时间:2017-11-16 19:23:44

标签: apache .htaccess mod-rewrite

我想在其网址中提供nomin的任何文件的未公开版本。

例如,如果我要求:

http://localhost/foo/bar.min.js?nomin

我应该收到文件:

http://localhost/foo/bar.js

但是,我希望只有文件存在才会发生。

这就是我在.htaccess文件中的内容:

RewriteCond %{QUERY_STRING} nomin
RewriteCond %{REQUEST_URI} (.*)\.min(\..*)
RewriteCond %{DOCUMENT_ROOT}/$1$2 -f
RewriteRule (.*)\.min(\..*) $1$2 [L,QSA,NC]

然而,它不起作用。如果我删除我检查文件是否存在的行:

RewriteCond %{DOCUMENT_ROOT}/$1$2 -f

它开始工作,但可能指向不存在的文件。

我试过了:

  • 删除斜杠RewriteCond %{DOCUMENT_ROOT}$1$2 -f
  • 使用REQUEST_URI之类的RewriteCond %{REQUEST_URI}/$1$2 -f(使用和不使用斜杠),即使它没有多大意义。
  • 匹配整个内容,只检查“.min”

    以外的部分
    RewriteCond $0 (.*)\.min(\..*)
    RewriteCond $1$2 -f
    

我做错了什么?

附带问题:有没有办法更改我的RewriteCondRewriteRule,这样我就不必再写(.*)\.min(\..*)两次了?

1 个答案:

答案 0 :(得分:1)

这应该适合你:

RewriteCond %{QUERY_STRING} ^nomin$ [NC]
RewriteCond %{REQUEST_URI} ^(.+)\.min(\.[^.]+)$ [NC]
RewriteCond %{DOCUMENT_ROOT}/%1%2 -f
RewriteRule ^ %1%2 [L,NC]

使用%1%2代替$1$2,用于从RewriteCond

中捕获的值