【问题标题】:.htaccess cascading conditions.htaccess 级联条件
【发布时间】:2014-12-29 15:59:25
【问题描述】:

我正在尝试弄清楚如何管理 .htaccess 中潜在的冲突条件

我的设置如下: - 我有一个 CMS 在可以通过 myCMSdomain.com 访问的服务器上运行,其中 myCMSdomain.com 将是 CMS 主页,myCMSdomain.com/admin 将是管理界面。 - 使用此 CMS 的站点应指向 myCMSdomain.com/sites/index.php - 所有网站的图片都可以在 myCMSdomain.com/admin/images/sitename/...后面的某个地方找到。

以下是我尝试解决此问题的方法:

RewriteCond %{HTTP_HOST} !^(www.)?myCMSdomain.com$ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . sites/index.php 

这样,所有来自其他域名的传入请求都会被 index.php 文件正确处理,但由于图像托管在其他地方,我想使用一条规则,即应该在其他地方获取图像,如下所示:

图片可见的url格式为:images-[sitename]/[image_path] 图片的真实位置是:admin/site/[sitename]/[image_path]

以下规则有效,但不能与第一条规则结合使用

重写规则图像-([a-zA-Z0-9]+)/(.*)$ admin/site/$1/images/$2

图像最终调用 index.php 而不是使用我为它们定义的规则。 我试图从条件中排除图像目录,但它也不起作用:

RewriteCond %{REQUEST_URI} !(images-([a-zA-Z0-9]+)/(.*))

我将来可能会遇到类似的问题,但有其他例外,所以我想知道是否有办法处理这个问题。

谢谢! 洛朗

更新 1: 如果我在所有其他规则之上使用以下规则

仅当我使用 myCMSdomain.com 域名时才有效 如果我使用像 anotherdomain.com 这样的任何其他域,则该规则会导致 http 500

RewriteRule images-([a-zA-Z0-9]+)/(.*)$ manager/site/$1/images/$2

所以http://www.myCMSdomain.com/images-test/test.jpg 引导我找到正确的图像 但是http://www.anotherdomain.com/images-test/test.jpg 导致我收到 500 http 错误代码,而此域正确指向站点/index.php

更新 2: 应贾斯汀的要求,这里是服务器上物理目录结构的视图

/admin/
/admin/site
/admin/site/site_name/
/admin/site/site_name/images/
/sites/
/sites/js
/sites/css

【问题讨论】:

  • 您的 .htaccess 在此路径中的什么位置?对于哪个 URL,您会得到 500,您使用什么确切的 URL?还要检查您的 Apache error.log 以了解 500 错误的原因
  • htaccess 文件位于根目录下,比 /admin/ 或 /sites 高一级。它不是专用服务器,我无法访问所有日志,但据我所知,我有一个反复出现的错误:由于可能的配置错误,请求超出了 10 个内部重定向的限制。如有必要,使用“LimitInternalRecursion”增加限制。使用“LogLevel debug”获取回溯。
  • 我还需要知道根目录下的任何子目录中是否还有另一个.htaccess?
  • 不,它是此服务器上唯一的 htaccess。谢谢
  • 您需要启用RewriteLog 并在您获得500 时添加有问题的重写日志。

标签: .htaccess mod-rewrite


【解决方案1】:

您可以重新排列条件逻辑。

# if www.myCMSdomain.com or myCMSdomain.com -> do nothing
RewriteCond %{HTTP_HOST} ^(?:www\.)?myCMSdomain\.com$ [NC]
RewriteRule ^ - [L]

# if we reach here, this means it's a subdomain/another domain

# images rule
RewriteRule ^images-([^/]+)/(.+)$ /admin/site/$1/images/$2 [L]

# not a file/directory -> sites/index.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ /sites/index.php [L]

也可以按照你的方式写,但是会更长。
另外,请记住条件 (RewriteCond) 是非累积的:它们仅适用于下一条规则 (RewriteRule)

【讨论】:

  • 感谢贾斯汀的快速回答!图像规则将我引导至 http 500 错误代码。如果我使用 myCMSdomain.com 域,则该规则有效,但如果我使用另一个指向服务器的域名,它会导致我出现 http 500 错误。有什么想法吗?
  • 你能给你的文件夹更清晰的树状结构吗?因为很难代表阅读您的问题
  • 当然,刚刚添加了细节。看起来不允许外部域返回结构并从管理目录中获取某些内容
  • 您必须确保 mod_rewrite 已启用并且 htaccess 在您的 Apache 配置中被允许。然后,确保所有其他域都指向与 myCMSdomain.com 相同的文档根目录,并将您的 htaccess 放在根文件夹中。之后,这应该工作
  • mod_rewrite 开启,规则分开且htaccess在根目录时重写工作。
【解决方案2】:

我已经在这个问题上苦苦挣扎了一段时间,但最后我想我找到了这个问题。看起来域名配置有问题,我不知道具体是什么,但是一旦我重新保存了所有域的映射,htaccess 就可以正常工作了。

最后我使用了贾斯汀的提议,它看起来比我的更有前途。

感谢大家的帮助,祝大家新年快乐

劳伦特

【讨论】:

    猜你喜欢
    • 2021-03-15
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 2015-06-28
    • 2013-08-22
    • 1970-01-01
    • 2014-12-18
    • 2016-12-17
    相关资源
    最近更新 更多