Laravel - htaccess从www重定向到非www,从http转发到https请求uri转到index.php

时间:2017-11-02 10:10:25

标签: laravel .htaccess redirect https laravel-5.2

我尝试了几种解决方案,但似乎都没有。我有一个Laravel应用程序(公共文件夹被删除),我想将用户重定向到HTTPS和我的网站的非www版本 这是我想要完成的动作的一个例子

  1. http://example.com重定向到https://example.com
  2. http://www.example.com重定向到https://example.com
  3. https://www.example.com重定向到https://example.com
  4. 我能够在htaccess

    上使用以下代码完成此操作
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www\.example.com$ [NC]
    RewriteRule (.*) https://example.com [R=301,L] 
    

    现在,由于网站有很多链接,我想重定向用户,而不会丢失域后的任何文本。这是一个例子

    1. https://www.example.com/electronics/laptops/hp重定向到https://example.com/electronics/laptops/hp
    2. 我使用$和request_uri尝试了很多变体,但它们仍然会重定向到https://example.com/index.php。在这里搜索答案后,我尝试的最后一件事看起来像是这样,产生了相同的结果

      RewriteEngine on
      RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
      RewriteRule ^ https://example.com%1%{REQUEST_URI} [L,R=301,NE]
      

      这似乎会将https://www.example.com/string1/string2/string3的所有流量重定向到https://example.com/index.php

      那么我如何才能按预期重定向流量,这是一种更好的做法。编写两个规则或使用If语句组合规则。

      我想只使用htaccess方法,没有中间件。

5 个答案:

答案 0 :(得分:0)

要将www请求重定向到非www而不丢失路径或查询字符串,这是正确的格式:

RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule (.*) https://example.com/$1 [R=301,L]

如果您的网站位于没有反向代理的服务器上,您可以轻松地将非HTTPS请求重定向到HTTPS,如下所示:

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

如果存在反向代理或负载均衡器,则需要检查转发的标头,具体取决于代理配置(例如X-Forwared-Proto

答案 1 :(得分:0)

试试这个

 # Redirect from http to https

    RewriteEngine on
    # Redirect to HTTPS
    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

 # (http://www.example.com/foo will be redirected to http://example.com/foo)

  RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
  RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301]

#  to redirect index.php to the root

RewriteCond %{THE_REQUEST} ^.*/index\.php 
RewriteRule ^(.*)index.php$ /$1 [R=301,L] 

答案 2 :(得分:0)

我遇到了同样的问题

您应该在

之后将此代码放在.htaccsee文件之上
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://yourdoamin.com%{REQUEST_URI} [L,R=301,NC]

如果你把它放在

之后
 # Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

您的网页重定向到yourdomain.com/index.php

答案 3 :(得分:0)

我遇到了同样的问题

您应该在

之后将此代码放在.htaccsee文件之上
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://yourdoamin.com%{REQUEST_URI} [L,R=301,NC]

如果你把它放在

之后
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

您的网页重定向到yourdomain.com/index.php

答案 4 :(得分:0)

花了几个小时在网上搜索并测试了不同的建议之后,我找到了解决方案。

  

.htaccess在public_html中

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^public
    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
  

.htaccess在公用文件夹中

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

    RewriteEngine On

    # Redirect to https
    RewriteCond %{SERVER_PORT} 80
    RewriteRule ^(.*)$ https://yourdomain.com/$1 [R,L]

    # Redirect to non www
    RewriteCond %{HTTP_HOST} ^www.yourdomain.com$ [NC]
    RewriteRule ^(.*)$ https://yourdomain.com/$1 [R=301,L]

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

    # This made the trick for me
    # Remove index.php from the url
    RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
    RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]
</IfModule>

我希望这也会对其他人有用