【问题标题】:Use RewriteCond based on environment variable in .htaccess根据 .htaccess 中的环境变量使用 RewriteCond
【发布时间】:2023-03-21 00:55:01
【问题描述】:

我正在尝试在我的 .htaccess 文件中定义一个环境变量,然后使用该变量运行重写条件。以下是我的 .htaccess 文件中的内容,但重写不起作用:

RewriteEngine on
#set to 'live' or 'maintenance'
SetEnv ENVIRONMENT maintenance

#If the ENVIRONMENT variable is 'mainetnance' then show a maintenance page to the users
RewriteCond %{ENV:ENVIRONMENT} maintenance
RewriteRule ^(.*)$ /maintenance.html

这样做的目的是通过让 PHP 在收到来自 GitHub 挂钩之一的发布请求以拉取 repo 进行更新时,以编程方式将站点设置为维护模式。

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

    mod_rewrite 不使用通过 SetEnv 设置的变量,而是使用这种方法:

    #set to 'live' or 'maintenance'
    RewriteRule .* - [E=STATUS:maintenance]
    
    #If the ENVIRONMENT variable is 'maintenance' then show a maintenance page
    RewriteCond %{REQUEST_URI} !maintenance.html [NC]
    RewriteCond %{ENV:STATUS} ^maintenance$
    RewriteRule ^.*$ /maintenance.html [L]
    

    底部三行的第一行,确保一旦用户被重定向到文件“maintenance.html”,就不会再次被重定向。否则,用户不断被重定向到同一个文件,导致 500 内部服务器错误提示“AH00124:由于可能的配置错误,请求超出了 10 次内部重定向的限制。”

    【讨论】:

    • 谢谢杰弗里。我试过了,但我得到一个 500 错误。我完全复制了您所拥有的内容,唯一的区别是我的前两行包括: RewriteEngine on Options -Indexes 但这些行不应导致该错误。
    【解决方案2】:

    我发现几乎每个示例都不完整,所以我将我的解决方案带到桌面上。我需要根据我的服务器环境创建一个变量 - localproduction - 然后根据该服务器环境运行重写。具体来说,如果环境是生产环境,我想强制https和www。

    为什么不为每个服务器环境创建一个唯一的 .htaccess 文件?因为,我想将 .htaccess 包含在我的 Git 存储库中,而不用担心搞砸我的一个环境。

    您需要知道的第一件事是,所有这些都必须发生在 mod_rewrite 中,这意味着您必须在 Apache 实例中启用 mod_rewrite。如果您不知道如何检查,请创建一个 phpinfo 页面 (http://www.phpinfofile.com/) 并在“加载的模块”部分中搜索“mod_rewrite”。

    .htaccess 代码:

    <IfModule mod_rewrite.c>
    
    # Set SERVER_ENV=production if HTTP_HOST matches my production URL
    RewriteCond %{HTTP_HOST} ^(www\.)?mysite\.com$ [NC]
    RewriteRule .* - [E=SERVER_ENV:production]
    
    # Force www. if SERVER_ENV is production
    RewriteCond %{ENV:SERVER_ENV} ^production$
    RewriteCond %{HTTP_HOST} !^www [NC]
    RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    
    # Force https if SERVER_ENV is production
    RewriteCond %{ENV:SERVER_ENV} ^production$
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteCond %{HTTPS} off
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    
    # Set SERVER_ENV=local if HTTP_HOST matches my local URL
    RewriteCond %{HTTP_HOST} ^www-local\.mysite\.local$ [NC]
    RewriteRule .* - [E=SERVER_ENV:local]
    
    </IfModule>
    

    注意事项:

    1. 第一个变量名为“SERVER_ENV”,值为“production”。这个变量名/值可以是任何东西。例如,您可以使用 MY_ENVIRONMENT:live。在 .htaccess 中创建此变量后,您应该能够在 phpinfo 文件中找到它的引用——这是检查它是否存在的好方法。

    1. RewriteCond 行应该在 RewriteRule 之前,并且应该如图所示组合在一起。在重写规则生效之前,您可以有 1 个或多个必须满足的重写条件。

    2. 如果 HTTP_HOST 是“本地”,我将设置一个不同的变量。我没有任何使用“本地”变量的重写条件/规则 - 我只是为了说明而在此处设置它。

    【讨论】:

      【解决方案3】:

      有点晚了 - 但对于所有其他搜索...

      使用 SetEnvIf - 请参阅: mod_rewrite rule and setenv

      SetEnvIf Request_URI ".*" ENVIRONMENT=maintenance

      ...

      【讨论】:

        猜你喜欢
        • 2018-03-17
        • 2022-09-23
        • 2015-03-19
        • 1970-01-01
        • 2016-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多