【问题标题】:Apache rewrite rule undesirably applies for different directoryApache重写规则不希望地适用于不同的目录
【发布时间】:2011-11-29 12:12:43
【问题描述】:

设置

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

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/等)。

期望的结果

如何调整这条规则,以便...

  1. 管理索引 (site1/admin/) 受此规则限制。
  2. 此规则忽略管理 JavaScript 文件 (site1/scripts/admin.js)。
  3. 我们保留规则的动态起始位 (RewriteRule .*/admin),因此无论使用的目录名称如何,Apache 都将继续自动正常工作,我们可以将其修改为具有相同的效果,但最终结果是它必须保持动态。
  4. 我没有重命名 admin.js,因为它很便宜,因此我不会从中学习。

【问题讨论】:

  • 我已经阅读了这个问题,但我无法理解您想要达到的目标。请举例说明应该重写的东西(以及它们应该变成什么)和不应该重写的东西。
  • localhost/site1/example.js 被重写为 localhost/scripts/example.js(正确)
  • localhost/site1/admin.js 被帖子中的规则捕获并抛出 HTTP 404。我认为因为 .*/ 可能适用于两个目录深度而不是仅一个目录深度。那么我们可以限制规则的目录深度吗?

标签: apache mod-rewrite


【解决方案1】:

您可以尝试几件事,具体取决于您的其他所有工作方式。如果 site1/scripts/admin.js 存在并且您希望访问现有文件(如脚本或图像)的 URI 不被重写,您可以尝试在 RewriteRule 之前添加此权利:

RewriteCond %{REQUEST_FILENAME} !-f

或者,您也可以在 RewriteRule 之前添加它,这样脚本就不会被重写:

RewriteCond %{REQUEST_URI} !\.js$

.js 结尾的请求将不符合该条件,并且不会应用该规则。或者,您可以将其范围缩小到 admin\.jsscripts/[^\.]+\.js(替换条件中的 \.js)。


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

如果您使用[^/]+ 而不是.*,则可以。

【讨论】:

  • RewriteCond %{REQUEST_URI} !\.js$ 工作,谢谢。如果您或其他任何人想要贡献,我仍然对目录深度限制持开放态度;我们拥有的工作代码越多,这也就越有可能对其他人有所帮助。
猜你喜欢
  • 2013-03-01
  • 1970-01-01
  • 2014-07-24
  • 2013-09-02
  • 2018-05-06
  • 2019-04-08
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
相关资源
最近更新 更多