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



我正试图在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替换字符串中设置相对路径(不以斜线开头(的情况。

但我不明白为什么两个RewriteCond应该只拦截Yii应用程序的URI。

<blockquote\
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不作为物理文件存在(。

相关内容

  • 没有找到相关文章

最新更新