从 http 重定向到 https 时,从 url 中删除斜线

Posted

技术标签:

【中文标题】从 http 重定向到 https 时,从 url 中删除斜线【英文标题】:Slash being removed from url when redirecting from http to https 【发布时间】:2021-09-23 17:08:37 【问题描述】:

由于某种原因,当我在他们的任何页面上以非 https 格式访问其中一个 url 时,它会将您重定向到一个损坏的链接,其中一个斜杠已被删除(从而更改 url 中的实际域并吸引用户场外)。

http://www.example.com/fr-FR 执行 302 重定向到 https://www.example.comfr-fr

在顶层,一切正常,http://www.example.com 重定向到 https://www.example.com

我尝试编辑 .htaccess 文件以捕获所有 http 并重定向到 https,但没有运气。我曾尝试将特定 url 重定向到他们的 https 对应,但在我的重定向被命中之前,我们仍然命中了相同的 302 重定向。

我也在 vhost 文件中尝试了许多不同的重定向,但由于某种原因,似乎没有任何影响这个问题。我还尝试删除 .htaccess 并删除 vhost 文件以删除任何有罪的代码,但这也无济于事。 有谁知道是什么导致了这个问题?

这是 .conf 文件:

    <VirtualHost *:80>
    ServerName example.com/
    ServerAlias www.example.com/
    DocumentRoot /var/www/2lbgfz7l.example.com
    DirectoryIndex index.html
    ErrorLog /var/log/apache2/2lbgfz7l.example.com.error.log
    CustomLog /var/log/apache2/2lbgfz7l.example.com.access.log combined
    Redirect 301 / https://www.example.com/$1

    <Location / >
        RewriteEngine on
        RewriteCond %REQUEST_FILENAME -s [OR]
        RewriteCond %REQUEST_FILENAME -l [OR]
        RewriteCond %REQUEST_FILENAME -d
        RewriteRule ^.*$ - [NC,L]
        RewriteRule ^(.*) /index.html/ [NC,L]
    </Location>

    <Directory "/var/www/2lbgfz7l.example.com">
            Options -Indexes +FollowSymLinks -MultiViews
            AllowOverride All
    </Directory>
</VirtualHost>

<IfModule mod_ssl.c>
  <VirtualHost *:443>
        ServerName example.com/
        ServerAlias www.example.com/
        DocumentRoot /var/www/2lbgfz7l.example.com
        DirectoryIndex index.html

        ErrorLog /var/log/apache2/example.com.error.log
        CustomLog /var/log/apache2/example.com.access.log combined

        <Directory "/var/www/2lbgfz7l.example.com">
                Options -Indexes +FollowSymLinks -MultiViews
                AllowOverride All
        </Directory>

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        SSLEngine on

        <FilesMatch "\.(cgi|shtml|phtml|php)$">
            SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
            SSLOptions +StdEnvVars
        </Directory>

        BrowserMatch   "MSIE [2-6]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
        SSLCertificateChainFile /etc/apache2/ssl.crt/example.com.chain-2.pem
        SSLCertificateFile /etc/apache2/ssl.crt/example.com.chain-2.pem
        SSLCertificateKeyFile /etc/apache2/ssl.crt/example.com.key
    </VirtualHost>
</IfModule>

这是 .htaccess 文件:

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType image/jpg "access 1 year"
    ExpiresByType image/jpeg "access 1 year"
    ExpiresByType image/gif "access 1 year"
    ExpiresByType image/png "access 1 year"
    ExpiresByType text/css "access 1 month"
    ExpiresByType text/html "access 1 month"
    ExpiresByType application/pdf "access 1 month"
    ExpiresByType text/x-javascript "access 1 month"
    ExpiresByType text/css "access plus 1 year"
    ExpiresByType application/x-shockwave-flash "access 1 month"
    ExpiresByType image/x-icon "access 1 year"
    ExpiresDefault "access 1 month"
</IfModule>

<IfModule mod_headers.c>
  <FilesMatch "\.(js|css|xml|gz)$">
    Header append Vary: Accept-Encoding
  </FilesMatch>
</IfModule>

<ifModule mod_gzip.c>
    mod_gzip_on Yes
    mod_gzip_dechunk Yes
    mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
    mod_gzip_item_include handler ^cgi-script$
    mod_gzip_item_include mime ^text/.*
    mod_gzip_item_include mime ^application/x-javascript.*
    mod_gzip_item_exclude mime ^image/.*
    mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>

<IfModule mod_deflate.c>
    SetOutputFilter DEFLATE
    AddOutputFilterByType DEFLATE text/html text/css text/plain text/xml text/x-js text/js
</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %HTTP_HOST ^example\.com [NC]
    RewriteCond %SERVER_PORT 80
    RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

    RewriteEngine On
    RewriteCond %HTTP_HOST !^www\.
    RewriteRule ^(.*)$ https://www.%HTTP_HOST/$1 [R=301,L]
</IfModule>

【问题讨论】:

尝试清除浏览器缓存。 @KJ 抱歉,我在问题中使用了 example.com,因为我无权分享我目前实际工作的域。真实域名不同,问题依旧。 @AmitVerma 我已清除浏览器缓存,在多个网络上的多台计算机上尝试过,问题仍然存在。 你为什么要在两个不同的地方重定向到 HTTPS?您的端口 80 的虚拟主机已经包含 Redirect 301 / https://www.example.com/$1(虽然这有点错误,但没有 $1,因为没有人在那里进行任何模式捕获 - 但由于重定向基于路径前缀工作,$1 可以简单地去掉来达到想要的效果),然后在.htaccess中你再试一次。 感谢 @CBroe 的捕获,我已经删除了 $1,这与重复的重定向一起,很可能是在尝试解决问题时纯粹受挫的结果,哈。跨度> 【参考方案1】:

看起来问题是我在/etc/apache2/sites-available 中处理的.conf 文件没有被服务器读取,因为在/etc/apache2/sites-enabled 而不是我在/sites 中处理的.conf 文件的符号链接-available 存在 .conf 文件的副本,服务器正在读取该文件。此 conf 文件包含不正确的重定向 - 一旦我删除此重复文件并通过运行添加符号链接

sudo ln -s /etc/apache2/sites-available/example.com.conf 来自 etc/apache2/sites-enabled 目录,我更新的 .conf 文件已被读取。

在我更新的文件中,我删除了指令:

   <Location / >
        RewriteEngine on
        RewriteCond %REQUEST_FILENAME -s [OR]
        RewriteCond %REQUEST_FILENAME -l [OR]
        RewriteCond %REQUEST_FILENAME -d
        RewriteRule ^.*$ - [NC,L]
        RewriteRule ^(.*) /index.html/ [NC,L]
    </Location>

删除此问题后,问题解决了。

【讨论】:

以上是关于从 http 重定向到 https 时,从 url 中删除斜线的主要内容,如果未能解决你的问题,请参考以下文章

IIs 8 将 URL 从 http 重定向到 https

使用 .htaccess 将 www URL 重定向到 https 的非 www

Nginx 从“www”重定向到“non www”以及从“http”到“https”?

asp.net c#从http重定向到https

如何使用漂亮的 url 将 HTTP 重定向到 HTTPS?

如何从android中重定向url加载图像