我使用的是 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
您的.htaccess
Laravel 看起来不对劲。我猜想它似乎只是一个简单的.htaccess
SEF/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]
只需将其注释掉