首页 > 解决方案 > 添加斜杠时,Laravel 在 URL 中恢复为 /public/

问题描述

这是我.htaccess在根目录中应该从 URL 中删除“公共”的目录:

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

这是我.htaccess在公共目录中应该去掉斜杠的:

<IfModule mod_rewrite.c>
    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]
</IfModule>

这一切都很好,除了当我输入一个带有斜杠的 URL 时,它会重定向回一个没有斜杠的 URL,但也会/public添加。

例如,我们有这条路线:

Route::get('/de', 'HomeController@index')->name('home');

通常,该 URL 类似于 domain.com/de。

但是,如果我在domain.com/de/浏览器中输入,它会重定向到domain.com/public/de而不是到domain.com/de- 并且页面正常加载。

我该如何解决?

标签: laravelapache.htaccessmod-rewrite

解决方案


您的站点根目录 .htaccess 应该是这样的:

RewriteEngine On

# remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301,NE]

# route all requests to public/
RewriteRule ^(.*)$ public/$1 [L]

然后里面public/.htaccess有这个代码:

RewriteEngine On

# if /public/ is part of original URL then remove it
RewriteCond %{THE_REQUEST} /public/(\S*) [NC]
RewriteRule ^ /%1 [L,NE,R=301]

# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

确保在测试此更改之前完全清除浏览器缓存。


推荐阅读