Apache重写规则不希望应用于不同的目录

Apache重写规则不希望应用于不同的目录,apache,mod-rewrite,Apache,Mod Rewrite,设置 我的设置是为两个或多个具有相似结构但内容不同的站点共享资源。例如 http:// localhost/site1/ http:// localhost/site2/ 重写规则旨在为共享资源添加异常。在示例中,脚本文件夹(当然还有其中的所有内容)被重写,以便 http:// localhost/scripts/ …可在…访问 http:// localhost/site1/scripts/ http:// localhost/site2/scripts/ 问题 尝试访问时 http:/

设置

我的设置是为两个或多个具有相似结构但内容不同的站点共享资源。例如

http:// localhost/site1/
http:// localhost/site2/
重写规则旨在为共享资源添加异常。在示例中,脚本文件夹(当然还有其中的所有内容)被重写,以便

http:// localhost/scripts/
…可在…访问

http:// localhost/site1/scripts/
http:// localhost/site2/scripts/
问题

尝试访问时

http:// localhost/site1/scripts/admin.js
…以下重写通过当前规则应用,并尝试将其重写到管理目录

RewriteEngine on
RewriteRule .*/admin(.+) admin$1 [QSA] #Messes with scripts/admin.js
我认为这是一个目录深度问题,其中规则。*/可以应用于多个第一个目录(site1/),也可以固有地(不必要地)应用于所有目录深度(例如depth1/depth2/depth3/等)

期望的结果

如何调整此规则以便

  • 管理员索引(site1/admin/)由此规则计算
  • 此规则将忽略管理员JavaScript文件(site1/scripts/admin.js)
  • 我们保留了规则的动态起始位(RewriteRule.*/admin),因此无论使用的目录名是什么,Apache都将继续自动工作,或者我们可以修改它以获得相同的效果,但最终结果是它必须保持动态
  • 我不会重命名admin.js,因为这会很便宜,因此我不会从中学习

  • 你可以试着做一些事情,这取决于你如何让其他事情运转起来。如果site1/scripts/admin.js存在,并且您希望不重写访问现有文件(如脚本或图像)的URI,则可以尝试在重写规则之前添加以下内容:

    RewriteCond %{REQUEST_FILENAME} !-f
    
    RewriteCond %{REQUEST_URI} !\.js$
    
    或者,您也可以在重写规则之前添加以下内容,使脚本不会被重写:

    RewriteCond %{REQUEST_FILENAME} !-f
    
    RewriteCond %{REQUEST_URI} !\.js$
    
    .js结尾的请求将无法满足该条件,并且将不应用该规则。或者,您可以专门将其缩小到
    admin\.js
    scripts/[^\.]+\.js
    (替换条件中的
    \.js


    那么我们可以限制规则的目录深度吗


    如果你用
    [^/]+
    而不是
    *

    的话,你可以这样做。我已经把这个问题通读了一遍,但我不明白你想达到什么目的。请给出一些应该重写的东西(以及它们应该变成什么)和不应该重写的东西的例子。localhost/site1/example.js被重写为localhost/scripts/example.js(正确)localhost/site1/admin.js被文章中的规则捕获并抛出HTTP 404。我认为,.*/可能应用于两个目录深度,而不是一个目录深度。那么我们可以限制规则的目录深度吗?重写cond%{REQUEST\u URI}!\。js$成功了,谢谢。如果您或任何其他人想要贡献,我仍然会接受目录深度限制;我们拥有的代码越多,就越有可能帮助其他人。