.htaccess Wordpress网站子目录中的Yii2应用程序:无法启用漂亮的URL

.htaccess Wordpress网站子目录中的Yii2应用程序:无法启用漂亮的URL,.htaccess,yii2,apache2,.htaccess,Yii2,Apache2,我正试图在Wordpress位于根目录下的共享环境中部署一个基本的webapp。Yii2应用程序位于/子文件夹中 我跟在后面。在root的.htaccess中,我添加了: <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /subfolder RewriteCond %{REQUEST_URI} ^/subfolder RewriteCond %{REQUEST_URI} !^/subfolde

我正试图在Wordpress位于根目录下的共享环境中部署一个基本的webapp。Yii2应用程序位于/子文件夹中

我跟在后面。在root的.htaccess中,我添加了:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /subfolder
    RewriteCond %{REQUEST_URI} ^/subfolder
    RewriteCond %{REQUEST_URI} !^/subfolder/web
    RewriteRule ^assets/(.*)$ /web/assets/$1 [L]
    RewriteRule ^css/(.*)$ /web/css/$1 [L]
    RewriteRule ^js/(.*)$ /web/js/$1 [L]
    RewriteRule ^images/(.*)$ /web/images/$1 [L]
    RewriteRule (.*) /web/$1 [L]

    RewriteBase /subfolder
    RewriteCond %{REQUEST_URI} ^/subfolder
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /web/index.php
</IfModule>

# BEGIN WordPress
# The directives (lines) between "BEGIN WordPress" and "END WordPress" are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

重新启动发动机
重写基本/子文件夹
重写cond%{REQUEST_URI}^/子文件夹
重写cond%{REQUEST_URI}^/子文件夹/网站
重写规则^assets/(.*)$/web/assets/$1[L]
重写规则^css/(.*)$/web/css/$1[L]
重写规则^js/(.*)$/web/js/$1[L]
重写规则^images/(.*)$/web/images/$1[L]
重写规则(.*)/web/$1[L]
重写基本/子文件夹
重写cond%{REQUEST_URI}^/子文件夹
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
重写规则/web/index.php
#开始WordPress
#“开始WordPress”和“结束WordPress”之间的指令(行)为
#动态生成,只能通过WordPress过滤器修改。
#这些标记之间对指令的任何更改都将被覆盖。
重新启动发动机
重写基/
重写规则^index\.php$-[L]
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
重写规则/index.php[L]
#结束WordPress
但随着这些规则的加入,所有Wordpress的页面都是通过Yii处理(或尝试)的,因此这会中断博客的安装。这是捕获所有页面的第一个规则块,但我不明白为什么这两个
RewriteCond
应该只截取Yii应用程序uri。我检查了mod_重写文档,但不明白出了什么问题。感谢您的帮助。谢谢

不能在同一
.htaccess
文件中设置多个
RewriteBase
指令。最后一个实例“获胜”并控制整个文件。因此,在您发布的
.htaccess
文件中,WordPress代码块中设置的
RewriteBase/
实际上是为该文件设置的

但是,没有一条指令实际使用了
RewriteBase
指令,因此没有一条
RewriteBase
指令实际在做任何事情。
RewriteBase
指令仅适用于在
RewriteRule
替换字符串中设置了相对路径(不以斜杠开头)的情况

但我不明白为什么两个重写秒应该只截取Yii应用程序uri

大概您指的是这两个
RewriteCond
指令。。。在这种情况下,这两个条件实际上并没有起到任何作用
RewriteCond
指令仅适用于随后的第一条
RewriteRule
指令,因此它仅适用于重写
资产的指令

但是,此
重写规则
与文档根目录中的
/assets
匹配,而不是
/subfolder/assets
,这可能是要求-因此这些规则将无法匹配

但随着这些规则的加入,所有Wordpress的页面都是通过Yii处理(或尝试)的,因此这会中断博客的安装

这些规则肯定会“破坏博客安装”,然而,它们似乎没有“通过Yii”处理请求。实际上没有任何东西会将请求重写到
/子文件夹
。但是,下面的指令无条件地将所有内容重写到文档根目录中的
/web
目录中(该目录可能不存在),因此这肯定会“破坏”所有WordPress URL

事实上,我本以为这会创建一个重写循环(500个内部服务器错误响应)?!除非您在文档根目录下有一个子目录
/web
,该子目录还包含一个包含mod_rewrite指令的
.htaccess
文件?但这似乎不太可能,因为
/web
目录应该在
/子文件夹
目录中

请尝试以下操作:

RewriteEngine On

RewriteRule ^(subfolder)/(assets|css|js|images)/(.*) $1/web/$2/$3 [L]
RewriteRule ^(subfolder)/((?!web).*) $1/web/$2 [L]

RewriteRule ^subfolder/web/index\.php - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(subfolder)/. $1/web/index.php [L]

# BEGIN WordPress
:
不需要
包装器。或
RewriteBase
指令

或者 但是,最好将这些指令移动到项目根目录中自己的
.htaccess
文件中,即
/subfolder/.htaccess
——我相信这就是链接的“指南”所建议的。这使这两个项目完全分开。并避免在指令中明确包含
/子文件夹

此外,在
web
子目录中创建另一个
.htaccess
文件,即
/subfolder/web/.htaccess
。链接的“指南”中再次提出了这一点。但是,这也消除了在父
.htaccess
文件中路由请求所需的附加指令

例如,将这些更改放在一起,文档根目录中的
/.htaccess
文件应该只有WordPress指令。然后

/subfolder/.htaccess
/subfolder/web/.htaccess
同样,这里不需要
RewriteBase
指令——事实上,在这里使用
RewriteBase
可能会使事情复杂化。在
/子文件夹/web/.htaccess
文件中时,所有相对URL路径都是相对于该目录的


因此,请求
/subfolder/foo
会被
/subfolder/.htaccess
文件内部重写为
/subfolder/web/foo
。然后被
/subfolder/web/.htaccess
文件捕获(防止重写循环),并在内部重写为
/subfolder/web/index.php
(提供
foo
不作为物理文件存在)。

为了澄清,您的Yii2应用程序URL包括
/subfolder
/web
在根目录中,在
/子文件夹
之外?虽然您似乎在
/子文件夹
/web
之间切换,但Yii2应用程序位于
/子文件夹
中。yii2basic应用程序拥有
web/
中的所有公共内容,因此主要的Yii2
index.php
/su
RewriteCond %{REQUEST_URI} ^/subfolder
RewriteCond %{REQUEST_URI} !^/subfolder/web
RewriteRule ^assets/(.*)$ /web/assets/$1 [L]
RewriteRule (.*) /web/$1 [L]
RewriteEngine On

RewriteRule ^(subfolder)/(assets|css|js|images)/(.*) $1/web/$2/$3 [L]
RewriteRule ^(subfolder)/((?!web).*) $1/web/$2 [L]

RewriteRule ^subfolder/web/index\.php - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(subfolder)/. $1/web/index.php [L]

# BEGIN WordPress
:
RewriteEngine On

RewriteRule ^((?:assets|css|js|images)/.*) web/$1 [L]
RewriteRule ^((?!web).*) web/$1 [L]
RewriteEngine On

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]