无法浏览到新 Laravel Apache2 设置上的主 URL 以外的任何内容。错误:在此服务器上找不到请求的 URL

Posted

技术标签:

【中文标题】无法浏览到新 Laravel Apache2 设置上的主 URL 以外的任何内容。错误:在此服务器上找不到请求的 URL【英文标题】:Unable to browse to anything other than the main URL on a new Laravel Apache2 setup. ERROR: The requested URL was not found on this server 【发布时间】:2020-06-16 21:32:12 【问题描述】:

我用 Apache2 网络服务器建立了一个新的 Laravel 站点,并在同一台服务器上模仿了一个类似的工作站点的设置,但每次我浏览到一个 URL 是 example.com/anything 它给了我一个 404 page not found 错误。主站点 url 有效,但无法访问任何页面。

例如:

example.com 这很好 example.com/home 找不到页面错误 example.com/anything-i-put-here 找不到页面错误

该站点在其他服务器和本地运行良好,所以我确定它不是 Laravel 站点本身损坏了。同一台服务器上的另一个 laravel 站点具有基本相同的设置(据我所知)工作正常,所以我知道服务器本身设置正确并且正在为其他站点提供服务。

我对 apache2 虚拟服务器设置相当陌生,所以我很确定我只是没有正确配置它。我一直在互联网上搜索,并阅读了很多建议人们设置 apache2.conf 和 .htaccess 文件的帖子,这些文件与我拥有的基本上完全相同,所以我有点不知所措。有人有什么建议吗?

apache 配置文件(已启用站点的符号链接):

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    Redirect 301 / https://example.com/
    RewriteEngine on
    RewriteCond %SERVER_NAME =example.com
    RewriteRule ^ https://%SERVER_NAME%REQUEST_URI [END,NE,R=permanent]
</VirtualHost>
<VirtualHost *:443>
     DocumentRoot /var/www/example.com/public_html/public
     ServerName example.com

     <Directory /var/www/example.com/public_html/public>
        Options -Indexes +FollowSymlinks +MultiViews
        AllowOverride All
        Require all granted
#       SSLRequireSSL
     </Directory>
     <FilesMatch \.php$>
         SetHandler "proxy:unix:/var/www/example.com/fpm/php7.2-example.sock|fcgi://localhost/"
     </FilesMatch>
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile path/to/key.pem
SSLCertificateKeyFile path/to/key.pem
</VirtualHost>

.htaccess 文件:

<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>

是的,modrewrite 已启用

【问题讨论】:

.htaccess 文件位于何处?我肯定会删除 &lt;IfModule mod_rewrite.c&gt; 包装器,以防这掩盖了错误(无论如何都不需要)。您是否请求网站的 HTTPS 版本?当您请求 example.com/(即站点根目录)时,它不需要 .htaccess 中的任何内容 - 所以这可以解释为什么会这样。 在服务器配置中启用 MultiViews 似乎有点傻,只是在.htaccess 中再次禁用它。它应该从服务器配置的一开始就被禁用。 site-url.com 还是 my-site-url.com?你都用过,这是2个独立的域吗? - 如果指的是单个域,请使用example.comthoughout(根据RFC2606)。 你好怀特先生。谢谢你的cmets。 .htaccess 文件位于 /var/www/example.com/public_html/public 中。与 index.php 文件相同的位置。我很确定这是 Laravel 网站的正确位置。这是它在同一服务器上的另一个工作 Laravel 安装的位置。我的印象是 mod_rewrite 包装器用于添加省略的 index.php。不过我可能是错的,这不是我的强项。我正在请求网站的 https 版本,因此 http 应该重定向到 https。当您说“它实际上不需要 .htaccess 中的任何内容”时,您是什么意思? 是的,抱歉,我从其他方法中测试了一些东西,因此在不需要的地方添加了 MultiViews,所以我在 apache 配置中将此行恢复为原来的 Options -Indexes +FollowSymlinks +MultiViews。我已将 URL 更新到 example.com 以消除歧义。这里只有一个域存在问题。 【参考方案1】:

RewriteEngine On 之后的.htaccess 中使用以下代码

RewriteBase /

所以你的.htaccess 应该如下所示:

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

RewriteEngine On
RewriteBase /
# 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>

【讨论】:

如果.htaccess 文件已经在文档根目录中(它应该在的位置),那么设置RewriteBase / 不会改变任何东西。 我遇到了这个问题并像这样解决了它。让我们看看 OP 的项目是否有效。 嗨,瑞安。谢谢你的建议。我已经尝试根据您的建议添加 RewriteBase / 并重新启动 apache,但我仍然遇到同样的问题。

以上是关于无法浏览到新 Laravel Apache2 设置上的主 URL 以外的任何内容。错误:在此服务器上找不到请求的 URL的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel @Apache2 Server Ubuntu 14.04 LTS 中将 Root 设置为公用文件夹

laravel新创建的模块路由无法访问

这个 apache2.4 和 laravel 设置合适的虚拟主机是啥?

如何设置别名或 VirtualHost 以在 Apache2 上运行 laravel 项目

为啥我得到的是 Apache2 欢迎页面而不是 laravel 页面?

单击按钮后无法切换到新的浏览器窗口 C# Selenium