Apache 永久重定向从路径中删除斜杠

Apache 永久重定向从路径中删除斜杠

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

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

我不知道是什么原因造成这种情况。

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

<VirtualHost *:443>
    ServerAdmin [email protected]
    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 [email protected]
    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 项目,默认情况下公共文件夹确实包含一个 .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,它反而不重定向,尝试并给出 404http://www.derp.com/derp,但使用 Apache 的 404,而不是像 Laravel 那样在无需配置的情况下抛出未找到异常。

答案1

您的.htaccessLaravel 看起来不对劲。我猜想它似乎只是一个简单的.htaccessSEF/SEO 友好 URL。因此,它不应该是这样的:

<IfModule mod_rewrite.c>
    Options -MultiViews
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

尝试一下这个:

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

答案2

L4.1 将 .htaccess 中的尾部斜杠重定向到基础应用程序类中,而不是像以前一样

# Redirect Trailing Slashes…
RewriteRule ^(.*)/$ /$1 [L,R=301]

只需将其注释掉

相关内容