我正试图在Wordpress位于根目录的共享环境中部署一个基本的Web应用程序。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
但由于添加了这些规则,Wordpress的所有页面都是通过Yii处理(或尝试(的,因此这破坏了博客的安装。这是捕获所有页面的第一个规则块,但我不明白为什么两个RewriteCond
应该只拦截Yii应用程序URI。我查看了mod_rewrite文档,但不明白出了什么问题。感谢您的帮助。感谢
RewriteBase /subfolder
不能在同一个.htaccess
文件中设置多个RewriteBase
指令。最后一个实例";获胜";并控制整个文件。因此,在您发布的.htaccess
文件中,WordPress代码块中设置的RewriteBase /
实际上是为该文件设置的。
但是,没有一个指令实际使用RewriteBase
指令,因此RewriteBase
指令实际上没有执行任何操作。RewriteBase
指令仅适用于在RewriteRule
替换字符串中设置相对路径(不以斜线开头(的情况。
<blockquote\但我不明白为什么两个RewriteCond应该只拦截Yii应用程序的URI。
RewriteCond %{REQUEST_URI} ^/subfolder
RewriteCond %{REQUEST_URI} !^/subfolder/web
RewriteRule ^assets/(.*)$ /web/assets/$1 [L]
>假设您所指的是这两个RewriteCond
指令……在这种情况下,这两个条件实际上没有任何作用。RewriteCond
指令只适用于后面的第一个RewriteRule
指令,因此它只适用于重写assets
的指令。
但是,这个RewriteRule
与文档根目录中的/assets
匹配,而不是/subfolder/assets
,这可能是要求,因此这些规则将无法匹配。
但添加了这些规则后,Wordpress的所有页面都是通过Yii处理(或尝试(的,因此这破坏了博客的安装。
规则肯定会"破坏博客安装";,然而,他们似乎没有处理好请求;通过Yii";。实际上,没有任何东西可以将请求重写为/subfolder
。然而,以下指令无条件地将everything重写到文档根目录中的/web
目录(该目录可能不存在(,因此这肯定会";中断";所有WordPress URL。
RewriteRule (.*) /web/$1 [L]
事实上,我本以为这会创建一个重写循环(500内部服务器错误响应(?!除非文档根目录下有一个子目录/web
,其中还包含一个包含mod_rewrite指令的.htaccess
文件?但这似乎不太可能,因为/web
目录应该在/subfolder
目录内?
请尝试以下操作:
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
:
不需要<IfModule>
包装器。或者RewriteBase
指令。
或者
然而,最好将这些指令移动到项目根目录中它们自己的.htaccess
文件中,即/subfolder/.htaccess
——我相信这就是链接的";导向器";正在建议。这使得这两个项目完全分离。并且避免了必须在指令中显式地包含/subfolder
。
此外,在web
子目录中创建另一个.htaccess
文件,即/subfolder/web/.htaccess
。这在链接的";"引导";。然而,这也否定了在父.htaccess
文件中路由请求的额外指令的需要。
例如,将这些更改放在一起,文档根目录中的/.htaccess
文件应该只有WordPress指令。然后。。。
/subfolder/.htaccess
RewriteEngine On
RewriteRule ^((?:assets|css|js|images)/.*) web/$1 [L]
RewriteRule ^((?!web).*) web/$1 [L]
/subfolder/web/.htaccess
RewriteEngine On
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
同样,这里不需要RewriteBase
指令——事实上,在这里使用RewriteBase
可以说会使事情变得复杂。在/subfolder/web/.htaccess
文件中时,所有相对URL路径都是相对于该目录的。
因此,请求/subfolder/foo
会被/subfolder/.htaccess
文件内部重写为/subfolder/web/foo
。然后被/subfolder/web/.htaccess
文件捕获(防止重写循环(,并在内部重写为/subfolder/web/index.php
(假设foo
不作为物理文件存在(。