微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

htaccess将子域重写到某个文件夹如果存在

如何解决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]

这类似于:

  • 如果它不是以www开头
  • 在var中获取子域
  • 如果/ projects / subdomain 文件夹存在
  • 重写请求以查看该文件
  • 其他404

我将如何更新它以使其具有“如果/ 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的原始规则):

  1. 请求subdomain.mydomain.com/foo
  2. <doc-root>/projects/subdomain目录存在
  3. URL已重写为/projects/subdomain/foo
  4. 重写过程重新开始……将重写的URL(本质上为subdomain.mydomain.com/projects/subdomain/foo)传递回重写引擎。
  5. <doc-root>/projects/subdomain目录存在(与以前一样)
  6. URL已重写为/projects/subdomain/projects/subdomain/foo
  7. 重写过程重新开始...等等。

“重写”过程以这种方式循环,直到URL不变为止,除非采取其他措施……例如,如上所述,如果您在{{1}处有另一个.htaccess文件}还包含mod_rewrite指令,然后在第一轮重写处理之后,控制权将传递到此/projects/subdomain/.htaccess文件,并防止进一步的重写(因为默认情况下不继承mod_rewrite指令)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。