【问题标题】:non www url is redirecting to homepage非 www url 正在重定向到主页
【发布时间】:2021-03-26 03:08:34
【问题描述】:

我有 .htaccess 设置来获取对 www 的任何非 www 请求。

它适用于主页,但是当我检查其他 URL 时,它会转到主页。

这是我的设置(已更新):顶部来自 laravel

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

    <IfModule mod_rewrite.c>
    
    RewriteEngine on
    
    RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
    RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]
    
    #First rewrite any request to the wrong domain to use the correct one (here www.)
    RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [L,R=301]
    
    #Now, rewrite to HTTPS:
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    
    
    RewriteCond %{HTTP_USER_AGENT} libwww-perl.*
    RewriteRule .* ? [F,L]
    </IfModule>

例如

https://example.com 转到https://www.example.com

但是https://example.com/contact 不会转到https://www.example.com/contact。相反,它转到https://www.example.com

可能是什么问题和解决方案?

【问题讨论】:

  • 您如何路由/contact 的请求? (或者/contact 的请求映射到什么?)您的配置中似乎缺少一些指令?
  • 我已将我拥有的部分放在顶部进行了编辑。现在可能更清楚了。
  • 另一方面,我在 cpanel 上自动创建了这个重定向。 i.imgur.com/60YyZlB.png
  • 是的,您的指令顺序错误,正如我的回答中已经解释的那样。该 cPanel 重定向已包含在您发布的指令中。 (这就是 cPanel 为您所做的一切 - 它编辑 .htaccess 文件,但它添加的重定向始终位于文件末尾 - 这通常是错误的位置。)

标签: laravel .htaccess mod-rewrite


【解决方案1】:

https://example.com/contact 不会转到https://www.example.com/contact

假设您不是简单地使用 MultiViews/mod_negotiation 的无扩展 URL(即 /contact 映射到 /contact.php),那么您必须有其他 mod_rewrite 指令来路由这些请求。

您似乎将这些指令的顺序错误。

您问题中的外部重定向需要在您的.htaccess 顶部附近对前端控制器进行任何内部重写之前。

旁白:

#First rewrite any request to the wrong domain to use the correct one (here www.)
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [L,R=301]

此规则应重定向到https://,而不是http://。否则,您将获得多个不必要的重定向(https 到 http 并返回到 https)。

RewriteCond %{HTTP_USER_AGENT} libwww-perl.*
RewriteRule .* ? [F,L]

这条规则(目前是最后一条),需要放在顶部。一般来说,任何阻塞指令都应该放在第一位。您还可以稍微简化/优化它...

RewriteCond %{HTTP_USER_AGENT} libwww-perl
RewriteRule ^ - [F]

L 在使用 F 时是隐含的。如果没有 substitution 字符串,那么您应该使用-,而不是?


更新:根据您更新的问题,我的初步答案/假设得到确认......您的指令顺序错误。您的外部重定向需要 Laravel 前端控制器之前进行。

否则,按照当前的顺序,example.com/contact 形式的请求首先由 Laravel 前端控制器在内部重写为 index.php,然后会有一个外部重定向到规范方案 + 主机名,所以网络结果是你被重定向到主页。

您在 cmets 中提到的 cPanel 重定向只是在 .htaccess(您已经包含在内)中显示为规则。但请注意,所有 cPanel 重定向都(通常不正确)放置在 .htaccess 文件(这是 stated in the cPanel docs)的末尾。

所以,总而言之,你的指令应该这样写:

Options -MultiViews -Indexes
    
RewriteEngine on

#
# BLOCKING DIRECTIVES
#

# Block certain requests
RewriteCond %{HTTP_USER_AGENT} libwww-perl
RewriteRule ^ - [F]

#
# CANONICAL REDIRECTS
#
    
# Redirect non-www to www + HTTPS
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [L,R=301]
    
# Redirect HTTP to HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# Remove index.php
RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]
    
#
# Laravel directives follow...
#

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

【讨论】:

    【解决方案2】:

    我似乎正在处理这个

    <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}]
            
        ## Force https and www
        RewriteCond %{HTTPS} off [OR]
        RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
        RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
        
        # 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]
    
    RewriteCond %{HTTP_USER_AGENT} libwww-perl.*
    RewriteRule .* ? [F,L]
    
    RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
    RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]
    
    </IfModule>
    

    我们很乐意接受任何额外的优化建议

    【讨论】:

    • 我已经在我的回答中解释了指令的“错误顺序”。您基本上只需要反转这两个块,然后将 *all 您的外部重定向放在首位(我在回答中说过)。在您更新的指令中,最后的两个重定向仍应位于顶部,否则它们将不会做他们应该做的事情。请查看我更新的答案,其中包括按正确顺序排列的指令摘要。
    猜你喜欢
    • 2011-06-24
    • 2019-03-09
    • 2011-11-05
    • 2013-12-20
    • 2015-08-03
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多