gpt4 book ai didi

apache - 为什么 Apache 永久重定向会删除域和路径之间的斜线?

转载 作者:行者123 更新时间:2023-12-03 13:36:34 25 4
gpt4 key购买 nike

我使用的是 Apache 2.4,并设置了两个虚拟目录。一个需要 SSL,另一个重定向到它。

如果用户尝试访问 https://www.derp.com/derp如果/derp 不存在,它们会正确地得到 404。但是当用户访问 http://www.derp.com/derp 时, Apache 错误地将用户重定向到 https://www.derp.comderp ,删除路径和域名之间的斜线。

我不知道是什么原因造成的。

以下是我的虚拟主机的设置。

<VirtualHost *:443>
ServerAdmin derp@derp.com
ServerName www.derp.com
ServerAlias derp.com
DocumentRoot "C:\Users\derp\Documents\Web Projects\derp"
SSLEngine on
SSLCertificateFile "C:\Apache24\certs\cert.cer"
SSLCertificateKeyFile "C:\Apache24\certs\key.key"
</VirtualHost>

<VirtualHost *:80>
ServerAdmin derp@derp.com
ServerName www.derp.com
ServerAlias derp.com
Redirect permanent / https://www.derp.com/
</VirtualHost>

<Directory "C:\Users\derp\Documents\Web Projects\derp">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Require all granted
SSLRequireSSL
</Directory>

为什么 Apache 会有这样的行为?

奖励问题:应该在我的虚拟主机定义中处理重定向,还是应该在网站物理目录中的 .htaccess 文件中处理?

编辑:

我正在启动一个 Laravel 项目,默认情况下,公共(public)文件夹确实包含一个 .htaccess 文件,所以这就是那个人:
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>

编辑二:

我试过:
  • 在 DirectoryRoot 路径末尾添加斜杠
  • 将 DirectoryRoot 路径中的反斜杠替换为正斜杠
  • 在 DirectoryRoot 路径中用双反斜杠替换反斜杠

  • 我还完全从目录中删除了 .htaccess 文件。

    当您从 http://www.derp.com 开始时,它会正确重定向至 https://www.derp.com .仅当您指定路径并尝试使用 https 时,它才会删除域和路径之间的斜线。

    编辑三:

    我还尝试了以下建议:

    Redirect permanent / https://www.derp.com/

    Try

    RedirectMatch permanent /(.*) https://www.derp.com/$1

    or

    RedirectMatch permanent (.*) https://www.derp.com/$1


    ...而不是重定向到 https://www.derp.comderp ,而是不会重定向、尝试并为 http://www.derp.com/derp 提供 404 ,但使用 Apache 的 404,而不是像 Laravel 没有配置那样抛出 Not Found Exception。

    编辑四:

    我也试过:
    <IfModule mod_rewrite.c>
    Options -MultiViews
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>

    在 .htaccess 文件中,行为根本没有改变。

    最佳答案

    我得到了它。

    问题根本不在于重写,而是 SSLRequireSSL导致问题的我的目录定义下的指令。

    我只是删除了这个指令,刷新了所有浏览器中的缓存,然后该站点继续正常工作。这是通过消除过程发现的。

    文档说明:

    This directive forbids access unless HTTP over SSL (i.e. HTTPS) is enabled for the current connection. This is very handy inside the SSL-enabled virtual host or directories for defending against configuration errors that expose stuff that should be protected. When this directive is present all requests are denied which are not using SSL.



    重点是我自己的。如果未启用基于 SSL 的 HTTP,SSLRequireSSL 可能只会让 Apache 返回 403 或 404,从而干扰 Redirect规则。重写规则,例如 this answer on Server Fault 中的规则根据您的用例,可能是更好的选择:
    RewriteEngine On
    RewriteCond %{SERVER_PORT} !443
    RewriteRule ^(/(.*))?$ https://%{HTTP_HOST}/$1 [R=301,L]

    关于apache - 为什么 Apache 永久重定向会删除域和路径之间的斜线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20042434/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com