laravel路由与www不起作用,但非www起作用

时间:2019-01-06 15:45:35

标签: php laravel .htaccess routing

我有1个子域,我的路由全部在web.php中定义,用子域路由分隔 例如:admin.example.test,example.test

我正在代客托管我的网站,我正在尝试使www和非www路由都可以正常工作,非www似乎工作正常,但是当我添加www时,它将显示“抱歉,找不到您要查找的页面。”

我还在公用文件夹中添加了htaccess来将www重定向到非www站点,但是它似乎不起作用:

<IfModule mod_rewrite.c>
    RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
    RewriteCond %{HTTPS}s ^on(s)|
    RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

我做错什么了吗? laravel是否可以在没有www的情况下使用,并且不需要htaccess文件?

p / s:带有真实域名的共享托管也无法使用

2 个答案:

答案 0 :(得分:0)

您需要为这样的实例创建合适的CNAME记录:

www
mysite.com.

通常可以通过服务器提供商的GUI(例如Digital Ocean)来完成。

答案 1 :(得分:0)

我认为Laravel应该与subdomain routing一起使用,尽管您需要重复的路由:一个用于www,另一个用于非www版本。但是您可以对多个路由使用相同的功能。 如果您想使用Apache重写规则,请阅读以下步骤。

准备重写规则

在目录上下文中(即在.htaccess文件中),必须在文件中设置RewriteEngine on,重写规则才能起作用。 另外,在服务器级别(即httpd.conf文件中),Options FollowSymLinks必须存在。 配置块通常是这样的

<IfModule mod_rewrite.c>
    RewriteEngine On
    # ... your rewrite rules
</IfModule>

修复失败的重写条件

在Apache上,只有满足以上两个RewriteRule的情况下,RewriteCond才会执行。看一下第一个重写条件:

RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$

%{HTTP_HOST}是www路由的主机名(此处为admin.example.test),并且必须与模式^[^.]+\.[^.]+$匹配才能执行重写。但是正则表达式仅在主机名中允许一个点。因此,带有两个或多个点的主机名(即subdomain.example.test)与正则表达式不匹配,因此从www.example.test重写失败。 相反,您应该使用以下内容来支持子域:

RewriteCond %{HTTP_HOST} ^[^.]+(\.[^.]+)*$

配置块是否在正确的[虚拟]主机中?

也许不是。当您从www站点重定向到非www站点(也许从www.example.test重定向到example.test)时,RewriteRule将不起作用,而是重定向到www.www.example.test。这可能不是您想要的。 我认为此解决方案会起作用:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.[^.]+(\.[^.]+)*$
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://yourhostname%{REQUEST_URI} [L,R=301]

其中yourhostname是非www版本的主机名。它检查主机名是否以www.开头,并且是否与子域兼容。 而且,您甚至不必重启服务器,因为每个请求都会读取.htaccess文件!

如果您需要更多帮助