我有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:带有真实域名的共享托管也无法使用
答案 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文件!