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

标签 apache .htaccess mod-rewrite redirect https

我使用的是 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/

    相关文章:

    php - 在 php 中使用 .htaccess 重写 url

    php - 从 .htaccess mod_rewrite 规则中排除子域?

    Apache 身份验证用于外部访问,但不适用于本地访问

    java - Apache CXF java2ws 插件

    java - 信息 : Transport Used for JDBC connection: null + Apache Hive

    mysql - htaccess 重写图像目录的子域

    java - Apache POI 和 SXSSF : Number of rows always 0

    regex - 不带尾部斜杠的 Htaccess 重定向可以正常工作,但使用它则不行

    .htaccess - htaccess 日志禁止访问

    php - Htaccess 重写规则/a 到/a/b