【问题标题】:mod_rewrite: How to search in local folder, subfolder and then redirect to index.phpmod_rewrite:如何在本地文件夹、子文件夹中搜索然后重定向到 index.php
【发布时间】:2012-03-08 18:54:02
【问题描述】:

我需要创建以下规则以放置在我的 .htaccess 中

  1. 首先我想在主文件夹(/)中执行文件(如果请求的文件存在)
  2. 其次我想在子文件夹中搜索这个文件 -> /subfolder
  3. 如果文件不存在于第 1 点和第 2 点 id 喜欢重定向请求做 /index.php

最好的方法是什么。

感谢您的帮助:)

ps 第一点可以作为一个更简单的解决方案来消除。因此,如果用户输入 url /file.jpeg,服务器将在 /subfolder 中搜索该文件,如果没有找到该文件,它将重定向 rquest 做 index.php

【问题讨论】:

标签: apache .htaccess url mod-rewrite url-rewriting


【解决方案1】:

我假设您的网址如下所示:somesite.com/subfolder/file.extension如果网址不同,请提供详细信息。
将此添加到您的.htaccess 中的DocumentRoot

Options +FollowSymLinks -MultiViews -Indexes

RewriteEngine on
RewriteBase /

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

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

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

RewriteRule ^ /index.php [L]

已更改以适应 OP 要求。

RewriteEngine on
RewriteBase /

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

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

RewriteCond %{REQUEST_URI} ([\w]+\.[\w]+)$ [NC]
RewriteCond %{DOCUMENT_ROOT}/subdir/%1 -f
RewriteRule ^ /subdir/%1 [L]

RewriteRule ^ /index.php [L]

【讨论】:

  • 如果您使用的是共享主机服务,您可能会发现 %{DOCUMENT_ROOT} 不起作用。如果是这样,请执行phpinfo() 脚本并查找包含相同根目录的变量,例如 PHP_DOCUMENT_ROOTDOCUMENT_ROOT_REAL。然后你可以改用这个,比如%{ENV:PHP_DOCUMENT_ROOT}
  • 糟糕,%2 也不能进入下一条规则,因此您需要使用不同的策略。
  • @TerryE RewriteCond backreferences: These are backreferences of the form %N (1 <= N <= 9), which provide access to the grouped parts (again, in parentheses) of the pattern, from the last matched RewriteCond in the current set of conditions. 因为RewriteCond %{DOCUMENT_ROOT}/%2 -f 没有正则表达式字符串,它应该结转。
  • @ThinkinMmonkey,也许他们应该但他们没有。如果您有condA, condB, rule,则 condA 中的 %variables 在 condB 中可用,而 condB 中的 %variables 在 rule 中可用。由于逻辑真的是if(rule.regexp(...) && condA && condB) do replace,所以 $ 变量无处不在。
  • 嗯,这不是文档所说的,但如果你这么说......我会检查并查看源代码。我很想就此聊聊,但我现在必须做另一份工作。也许以后:-)
【解决方案2】:

这只是对 ThinkingMonkey 概述的方法的补充。正如我所评论的,% 变量仅在 next 条件或规则中可用。但是规则 $ 变量可用于 conds 和规则替换字符串,因此规则 2 应写为(与使用 DOCUMENT_ROOT 相同的警告):

RewriteCond %{DOCUMENT_ROOT}/$1 -f 
RewriteRule \w+/(\w+\.\w+)$ $1 [NC,L] 

或者如果你想做相反的事情

RewriteCond %{DOCUMENT_ROOT}/subdir/$1 -f 
RewriteRule (\w+\.\w+)$ subdir/$1 [NC,L] 

【讨论】:

    猜你喜欢
    • 2016-05-08
    • 2018-09-30
    • 2017-03-09
    • 2012-10-23
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    相关资源
    最近更新 更多