如何获得URL重写才能在Laravel 5中使用?

时间:2018-09-07 01:08:31

标签: php laravel macos apache mod-rewrite

除了基本URL和/site/public/文件夹中的文件之外,我无法设法使Laravel路由正常工作。

http://testurl/(通过apache虚拟主机设置)起作用,并加载主页。

http://testurl/blog)不起作用(返回404),但我希望这样做。

奇怪的是,http://testurl/index.php/blog 确实有效

我已经在100个不同的地方使用Google搜索,研究了无数的StackOverflow问题,并尝试了所有我能找到的东西,但没有任何效果。

我该如何解决?


配置信息

我在Apache 2.4.29上运行Laravel 5.7,在MacOSX 10.13.4上运行PHP 7.1.9。

我已经在httpd.conf中启用了重写模块,如下所示:

LoadModule rewrite_module libexec/apache2/mod_rewrite.so
...
<Directory />
    AllowOverride all
    Require all denied
</Directory>

我的httpd-vhosts.conf的设置如下:

<VirtualHost *:80>
    DocumentRoot "/Library/WebServer/Documents/site/public"
    ServerName testurl
    <Directory /Library/WebServer/Documents/site/public>
            Order Allow,Deny
            Allow from all
    </Directory>
</VirtualHost>

.htaccess文件夹中的/site/public/看起来像这样(我不想更改它):

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

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

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

我的config/app.php行如下:

'url' => env('APP_URL', 'http://testurl'),

最后但并非最不重要的一点,web.php看起来像这样:

<?php

Route::get('/', function () {
    return view('home');
});
Route::get('blog', function () {
    return view('blog');
}); 

如果我想念其他东西(或可以尝试的其他东西),请告诉我。

最好,我希望解决方案在部署到服务器时不需要我更改Laravel代码。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

经过大量搜索,我发现了this question,它帮助我找到了答案。

我需要做的就是像这样将AllowOverride All添加到我的httpd-vhosts.conf文件中:

<VirtualHost *:80>
    DocumentRoot "/Library/WebServer/Documents/site/public"
    ServerName testurl
    <Directory /Library/WebServer/Documents/site/public>
            AllowOverride All
            Order Allow,Deny
            Allow from all
    </Directory>
</VirtualHost>

这已解决了该问题,现在一切正常加载。