.htaccess - mod_rewrite 如果文件存在

标签 .htaccess mod-rewrite url-rewriting

我已经有两个现在可以正常工作的重写规则,但必须添加更多代码才能完美工作。

我在 mydomain.com 上托管了一个网站,并且所有 subdom.mydomain.com 都被重写为 mydomain.com/subs/subdom 。如果访问的文件不存在,我的 CMS 必须处理请求,重写是这样完成的:

RewriteCond $1 !^subs/
RewriteCond %{HTTP_HOST} ^([^.]+)\.mydomain\.com$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ subs/%1/index.php?page=$1 [L]

我的 CMS 像往常一样处理解析的下一部分。问题是如果一个文件真的存在,我需要在不通过我的 CMS 的情况下链接到它,我设法这样做:
RewriteCond $1 !^subs/
RewriteCond %{HTTP_HOST} ^([^.]+)\.mydomain\.com$
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ subs/%1/$1 [L]

到目前为止,它似乎很有魅力。现在我很挑剔,我需要将默认文件存储在 subs/default/中。如果该文件存在于子域文件夹中,我们应该获取该文件,否则,我们需要从默认子域中获取该文件。如果该文件在任何地方都不存在,我们应该使用来自当前子域的 404 页面,除非没有。

我希望它描述得足够好。感谢您的时间!

最佳答案

问题是你需要提供绝对文件系统路径才能得到-f-d在职的。如果您在文档根目录中,则可以使用以下规则:

RewriteCond $1 !^subs/
RewriteCond %{DOCUMENT_ROOT}/subs/default/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/subs/default/$1 -d
RewriteRule ^(.*)$ subs/default/$1 [L]

但是如果你在其他地方,就很难获得正确的路径前缀。

关于.htaccess - mod_rewrite 如果文件存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2770435/

相关文章:

kubernetes - 使用 nginx ingress kubernetes 重写目标问题

apache - 在用户不可见的情况下重写 URL

apache - 将旧搜索重定向到新搜索并保留第一个参数

c# - 在 .NET 中进行 URL 重写的最简单方法

mod-rewrite - 如何将 www.foo.com/bar 重定向到 www.foo.com :8080 without changing url?

apache - 重写规则以在 HTTP 和 HTTPS 上工作

regex - 匹配除 mod_rewrite 中的一个之外的所有子域

java - Browsermob代理(java): failing to rewrite a URL

.htaccess - 重定向到 .htaccess 中的 https 文件夹

.htaccess - 如何301将所有页面重定向到新域上的相同页面