移除URL目录名:WordPress与Laravel6路由配置异常问题
laravel目录的问题 首先明确:不需要修改httpd.conf,你的问题出在规则的放置位置和写法上。咱们一步步来修复:
问题分析
你把重写规则放在了laravel/.htaccess里,但请求首先会经过根目录的.htaccess(因为虚拟主机的DocumentRoot指向my_site/)。而且你写的RewriteRule ^laravel/(.*)$ /$1 [L,NC,R]是外部重定向,不是内部转发,这会导致请求被跳转到根目录,但根目录没有Laravel的入口文件,自然触发404错误。
正确的配置步骤
1. 调整根目录的.htaccess
在根.htaccess中,先添加Laravel的转发规则,再保留WordPress的规则(确保Laravel的请求先被处理,不会被WP接管)。示例如下:
# 开启重写引擎 RewriteEngine On RewriteBase / # 排除wp目录和Laravel自身目录的请求,避免循环 RewriteCond %{REQUEST_URI} !^/wp/ RewriteCond %{REQUEST_URI} !^/laravel/ # 把非WP的请求转发到laravel目录(如果你的Laravel入口在public子目录,要改成laravel/public/$1) RewriteRule ^(.*)$ laravel/$1 [L] # 下面保留你原来的WordPress规则(用于移除wp目录的配置) # 示例WP规则(根据你之前的实际配置调整) RewriteCond %{REQUEST_URI} !^/wp/ RewriteRule ^(.*)$ wp/$1 [L]
注意:如果你的Laravel是标准结构(入口文件在
laravel/public/),请把上面的RewriteRule目标改成laravel/public/$1,同时确保laravel/public/.htaccess是Laravel默认配置。
2. 修正laravel/.htaccess
删掉你之前添加的重定向规则,换成Laravel默认的路由处理规则,用于将非静态资源请求转发到入口文件:
Options +FollowSymLinks -MultiViews RewriteEngine On RewriteBase /laravel/ # 如果请求的是存在的文件或目录,直接返回 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f # 否则将请求转发到index.php处理路由 RewriteRule ^(.*)$ index.php?$1 [L,QSA]
若Laravel入口在
public目录,这个配置应该放在laravel/public/.htaccess中,laravel/根目录的.htaccess可以删除或改为转发到public目录。
验证逻辑
当用户访问subdomain.local:777/login时:
- 根
.htaccess捕获请求,内部转发到laravel/login laravel/.htaccess检查到login不是文件/目录,转发到laravel/index.php处理Laravel路由- 正常返回Laravel的登录页面
而访问subdomain.local:777时,会被WP的规则处理,返回着陆页,两者互不干扰。
内容的提问来源于stack exchange,提问作者PHP Ferrari

