Php 使用子域进行多次htaccess重写&;死刑

Php 使用子域进行多次htaccess重写&;死刑,php,web-services,.htaccess,redirect,apache2,Php,Web Services,.htaccess,Redirect,Apache2,我有一套复杂的重写规则,我正试图简化这些规则,但最终总是被束之高阁。我的目标如下: 通过www将所有流量重定向到网站(子域“test”和“dev”除外) 通过https重定向所有流量 使用url字符串作为参数,通过特定目录(“webservice”)中的文件重定向所有通信 到目前为止,我有两个htaccess文件,一个在我的web根目录中,另一个在我的webservice目录中 RewriteEngine On RewriteBase /webservice/rest # Ensure www

我有一套复杂的重写规则,我正试图简化这些规则,但最终总是被束之高阁。我的目标如下:

  • 通过www将所有流量重定向到网站(子域“test”和“dev”除外)
  • 通过https重定向所有流量
  • 使用url字符串作为参数,通过特定目录(“webservice”)中的文件重定向所有通信
  • 到目前为止,我有两个htaccess文件,一个在我的web根目录中,另一个在我的webservice目录中

    RewriteEngine On
    RewriteBase /webservice/rest
    
    # Ensure www on all URLs.
    RewriteCond %{HTTP_HOST} ^example.com [NC]
    RewriteCond %{HTTP_HOST} !^(dev|test)\. [NC]
    RewriteRule ^(.*)$ https://www.example.com%{REQUEST_URI} [L,R=301]
    
    RewriteRule ^([\w-]+)/?(\?([\w-=?&]))?$ api_client.php?method=$1&params=$2 [L,NC]
    
    我的根htaccess如下所示:

    RewriteEngine on
    # Ensure www on all URLs.
    RewriteCond %{HTTP_HOST} ^example.com [NC]
    RewriteCond %{HTTP_HOST} !^(dev|test)\. [NC]
    RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
    
    # Ensure we are using HTTPS version of the site.
    RewriteCond %{HTTPS} !on
    RewriteCond %{HTTP_HOST} !^(dev|test)\. [NC]
    #RewriteCond %{REQUEST_URI} !^/?(webservice)/
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    
    到目前为止,它工作良好,并通过www和https正确重定向了我的大部分流量

    在/webservice/rest中,我的第二个htaccess文件如下所示:

    RewriteEngine On
    RewriteBase /webservice/rest
    RewriteRule ^([\w-]+)/?(\?([\w-=?&]))?$ api_client.php?method=$1&params=$2 [L,NC]
    
    这将正确地将基于url的api参数重定向到/webservice/rest(“api\U客户端”)中的正确文件中

    这几乎是我设法得到的最终解决方案。剩下的问题是,指向“webservice”url的url没有重定向到www或https(我也不希望作为例外重定向指向/webservice/rest文件夹的“测试”和“开发”子菜单)


    在维护我的最终webservice HttAccess参数重定向的同时,您知道如何做到这一点吗?

    您需要在子目录的HttAccess文件中包含相同的www/https重定向,因为它取代了父目录中的规则

    RewriteEngine On
    RewriteBase /webservice/rest
    
    # Ensure www on all URLs.
    RewriteCond %{HTTP_HOST} ^example.com [NC]
    RewriteCond %{HTTP_HOST} !^(dev|test)\. [NC]
    RewriteRule ^(.*)$ https://www.example.com%{REQUEST_URI} [L,R=301]
    
    RewriteRule ^([\w-]+)/?(\?([\w-=?&]))?$ api_client.php?method=$1&params=$2 [L,NC]
    

    谢谢你,乔恩,这里离你很近,但不太近。如果我做了这个更改,我必须取消注释我的第一个代码块中的那一行——“RewriteCond%{REQUEST_URI}!^/?(webservice)/”并且它几乎都挂在一起,除非我请求一个仅以example.com(而不是www)开头的API我的最后一个重写规则没有正确执行参数-最终产品看起来也一样-我必须在我的第一个代码块中取消注释该行,否则我会被重定向到404Scratch,Jon-这对我来说很有效,必须只花几分钟的时间来完全传播。对于偶然发现这一点的其他人,我需要使用RewriteCond%{REQUEST_URI}!^/排除我的子目录?(webservice)/为了让它起作用,以及将我所有的愤怒添加到第二个htaccess文件中——也许其他人可以解释为什么