Laravel 和 Wordpress 在同一服务器/域上
Posted
技术标签:
【中文标题】Laravel 和 Wordpress 在同一服务器/域上【英文标题】:Laravel and Wordpress on same server/domain 【发布时间】:2016-02-29 14:31:06 【问题描述】:我正在尝试在 Laravel(5.1) 项目中托管一个 WordPress 网站。我有以下结构(精简了一些)
├── app
├── config
├── public
│ ├── index.php
│ ├── wordpress -> ../wordpress
│ └── .htaccess
├── resources
├── storage
├── vendor
└── wordpress
├── index.php
├── wp-admin
├── wp-config.php
├── wp-includes
└── .htaccess
vhost 文档根目录是公开的。
Wordpress 应该捕获所有通过 .htaccess 的内容。但是例如 /login 应该去 laravel。当我的项目增长时,我打算添加更多规则来捕获对 Laravel 的请求。我在 /public 中有以下 .htaccess 文件:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule "^/login" "index.php" [L]
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule "^(.*)$" "wordpress/$1" [L]
</IfModule>
但是当我向 /login 发出请求时,我仍然会看到 wordpress 页面。这是日志的一部分:
add path info postfix: /var/www/public/login -> /var/www/public/login/
strip per-dir prefix: /var/www/public/login/ -> login/
applying pattern '^/login' to uri 'login/'
add path info postfix: /var/www/public/login -> /var/www/public/login/
strip per-dir prefix: /var/www/public/login/ -> login/
applying pattern '^(.*)$' to uri 'login/'
RewriteCond: input='/var/www/public/login' pattern='!-d' => matched
RewriteCond: input='/var/www/public/login' pattern='!-f' => matched
rewrite 'login/' -> 'wordpress/login/'
add per-dir prefix: wordpress/login/ -> /var/www/public/wordpress/login/
strip document_root prefix: /var/www/public/wordpress/login/ -> /wordpress/login/
internal redirect with /wordpress/login/ [INTERNAL REDIRECT]
似乎重写并没有在 [L] 标志处停止。
【问题讨论】:
你应该看看 Themosis:framework.themosis.com 虽然这是一个很好的建议,但这并不是一个可行的解决方案。 Laravel 部分已经在开发中。 【参考方案1】:如评论中所问,回复如下:
正如您在日志中看到的,第一个条件不匹配:
applying pattern '^/login' to uri 'login/'
login/
不以/
开头
所以你需要把你的规则改成
RewriteRule "^login/" "index.php" [L]
【讨论】:
【参考方案2】:最后在 ServerFault 上问了同样的问题。我得到了答案。在此链接以供参考:
https://serverfault.com/questions/739728/laravel-and-wordpress-on-same-server-domain
【讨论】:
【参考方案3】:可以向默认的 Laravel .htaccess
文件添加重写条件,这将允许 Laravel 忽略对子目录 ( /wordpress ) 的所有请求。
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
# Ignore Wordpress directory
RewriteCond $1 !^(wordpress)
# Redirect Trailing Slashes...
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller...
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^ index.php [L]
</IfModule>
【讨论】:
这对我的情况没有帮助。因为 url 不应该包含 /wordpress。例如 url/login 和 url/portal 应该由 laravel 处理,而 url/info 和 url/blog 应该由 Wordpress 处理。以上是关于Laravel 和 Wordpress 在同一服务器/域上的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.4 和 WordPress 4.7 的辅助函数 __() 冲突
在 2 个 WordPress 上共享用户安装在同一台服务器上的 2 个子域中