无法浏览到新 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
文件位于何处?我肯定会删除 <IfModule mod_rewrite.c>
包装器,以防这掩盖了错误(无论如何都不需要)。您是否请求网站的 HTTPS 版本?当您请求 example.com/
(即站点根目录)时,它不需要 .htaccess
中的任何内容 - 所以这可以解释为什么会这样。
在服务器配置中启用 MultiViews 似乎有点傻,只是在.htaccess
中再次禁用它。它应该从服务器配置的一开始就被禁用。 site-url.com
还是 my-site-url.com
?你都用过,这是2个独立的域吗? - 如果指的是单个域,请使用example.com
thoughout(根据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 设置为公用文件夹
这个 apache2.4 和 laravel 设置合适的虚拟主机是啥?
如何设置别名或 VirtualHost 以在 Apache2 上运行 laravel 项目