我正在尝试在 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] 标志处停止。
答案1
正如您在日志中看到的那样,第一个条件不匹配:
applying pattern '^/login' to uri 'login/'
login/
不是以/
因此你需要将规则改为
RewriteRule "^login/" "index.php" [L]