如何解决htaccess将子域重写到某个文件夹如果存在
我知道关于子域->文件夹htaccess也有一些类似的问题,但是我已经有了适用于这种简单情况的设置。
我要添加的是“重写到项目/ 子域 / current / public /(如果存在当前/公共,则重写到projects / 子域 /”)
这是因为我托管了一个laravel应用程序,该应用程序位于“ public /”中,并且我使用了将“ current /”符号链接到其最新版本的工具来进行部署。
我当前的设置是:
# Redirect everything non-www to /projects/...
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www.* [NC]
RewriteCond %{HTTP_HOST} ^([^\.]+)\.mydomain\.com
RewriteCond /var/www/mydomain.com/projects/%1 -d
RewriteRule ^(.*) /projects/%1/$1 [L]
这类似于:
我将如何更新它以使其具有“如果/ projects / subdomain / current / public存在,那么,如果存在ELSE IF / projects / subdomain ,则那个,ELSE 404”?
谢谢!
解决方法
只需在现有规则之前创建另一个规则。例如,遵循与现有规则相同的模式:
RewriteEngine on
# Redirect to /projects/<subdomain>/current/public/
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^([^\.]+)\.mydomain\.com
RewriteCond /var/www/mydomain.com/projects/%1/current/public -d
RewriteRule (.*) /projects/%1/current/public/$1 [L]
# Redirect everything non-www to /projects/...
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^([^\.]+)\.mydomain\.com
RewriteCond /var/www/mydomain.com/projects/%1 -d
RewriteRule (.*) /projects/%1/$1 [L]
我从^
模式(RewriteRule
)中删除了^(.*)
,因为它是多余的。
我也将!^www.*
(匹配任何以“ www”开头的主机名)更改为!^www\.
(任何以“ www。”开头的主机名-仅子域),以避免可能的虚假匹配。
大概/var/www/mydomain.com
是文档根目录,因此您可以在DOCUMENT_ROOT
TestString 中使用RewriteCond
服务器变量。例如:
RewriteCond %{DOCUMENT_ROOT}/projects/%1/current/public -d
但是,这些指令本身会导致重写循环(500错误),因此我假设您已经有防止这种情况的指令。例如。您要重写的目录中的另一个.htaccess
文件包含mod_rewrite指令(与各个项目有关)吗?如果不是,那么您可以向每个检查REDIRECT_STATUS
环境变量的规则添加另一个条件,或者在文件顶部包含一个 exception ,以防止在重写请求后进一步处理。例如:
RewriteEngine On
# Stop further processing if the request has already been rewritten
RewriteCond %{ENV:REDIRECT_STATUS} !^$
RewriteRule ^ - [L]
: Remaining directives follow...
更新:如果您使用的是Apache 2.4,则可以简单地将L
标志更改为END
以暂停重写引擎的所有处理,以防止重写循环。 END
标志是一个相对较新的添加,因此经常被忽略-但这并不是严格必需的,因为总是有其他(也许更复杂的)方法来实现此目的。
为什么循环?
L
标志不会停止所有处理。它只是停止当前的处理,然后重写引擎有效地重新开始,将重写的URL传递回重写引擎。在上面的示例中,重写的URL也匹配相同的规则,因此该URL将一次又一次地被重写....
例如(为简单起见,仅使用重写为/projects
的原始规则):
- 请求
subdomain.mydomain.com/foo
-
<doc-root>/projects/subdomain
目录存在 - URL已重写为
/projects/subdomain/foo
- 重写过程重新开始……将重写的URL(本质上为
subdomain.mydomain.com/projects/subdomain/foo
)传递回重写引擎。 -
<doc-root>/projects/subdomain
目录存在(与以前一样) - URL已重写为
/projects/subdomain/projects/subdomain/foo
- 重写过程重新开始...等等。
“重写”过程以这种方式循环,直到URL不变为止,除非采取其他措施……例如,如上所述,如果您在{{1}处有另一个.htaccess
文件}还包含mod_rewrite指令,然后在第一轮重写处理之后,控制权将传递到此/projects/subdomain/.htaccess
文件,并防止进一步的重写(因为默认情况下不继承mod_rewrite指令)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。