RewriteRules 和 ErrorDocument 规则不适用于 SSL 虚拟主机

Posted

技术标签:

【中文标题】RewriteRules 和 ErrorDocument 规则不适用于 SSL 虚拟主机【英文标题】:RewriteRules and ErrorDocument rules not working for SSL vhosts 【发布时间】:2019-12-16 17:32:42 【问题描述】:

已知的 404 请求不会被重定向到 https... 并且只显示一个通用的 Not Found 404 ... 端口 80 上的 http 请求开始重写就好了...

注意事项:在 Apache 服务器 (2.4.39) 上使用 http.conf 文件(不是 .htaccess)在 64 位 Amazon Linux/2.8.9 上通过 AWS elastic beanstalk 启动。

例子:

example.com/fake sub.example.com/fake

未找到

在此服务器上未找到请求的 URL /fake。

.

我的配置文件有 2 个部分...

第 1 部分将 http 重定向到 https...这个 RewriteRule 完美运行...

  <VirtualHost *:80>
    ServerName sub.example.com
    DocumentRoot /var/www/html/sub
    RewriteEngine On
    RewriteCond %HTTP:X-Forwarded-Proto !https
    RewriteRule . https://%SERVER_NAME%REQUEST_URI [L,R]
  </VirtualHost>

第 2 部分应该将 sub.example.com/fake 重写为 sub.subdomain.com/?url=$1

  <VirtualHost *:443>
    ServerName sub.example.com
    DocumentRoot /var/www/html/sub
    RewriteEngine On
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteRule ^(.*)$ /index.php?url=$1 [L]
  </VirtualHost>

我认为重写规则是写错的部分,但这并不是因为即使以下尝试也不起作用。

  <VirtualHost *:443>
    ServerName sub.example.com
    DocumentRoot /var/www/html/sub
    ErrorDocument 404 "No go bro..."
  </VirtualHost>

我认为这只是子域的问题,但这也不起作用。

  <VirtualHost *:443>
    ServerName example.com
    DocumentRoot /var/www/html/www
    RewriteEngine On
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteRule ^(.*)$ http://google.com [L]
    ErrorDocument 404 "No go bro 1..."
  </VirtualHost>

  <VirtualHost *:443>
    ServerName sub.example.com
    DocumentRoot /var/www/html/sub
    RewriteEngine On
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteRule ^(.*)$ http://google.com [L]
    ErrorDocument 404 "No go bro 2..."
  </VirtualHost>

尝试按照建议添加覆盖,但没有奏效

  <VirtualHost *:443>
    <Directory /var/www/html/www>
      AllowOverride All
      Allow From All
    </Directory>
    ServerName ecample.com
    DocumentRoot /var/www/html/www
    RewriteEngine On
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteRule ^(.*)$ http://google.com [L]
    ErrorDocument 404 "No go bro..."
  </VirtualHost>

One reference 说 RewriteRules 需要在 VirtualHost 标签内的目录标签中......所以我尝试了,但没有运气

  <VirtualHost *:443>
    ServerName example.com
    DocumentRoot /var/www/html/www
    <Directory /var/www/html/www>
      Allow From All
      AllowOverride All
      RewriteEngine On
      RewriteCond %REQUEST_FILENAME !-f [OR]
      RewriteCond %REQUEST_FILENAME !-d
      RewriteRule ^(.*)$ /index.php?url=$1 [L]
      ErrorDocument 404 "No go bro..."
    </Directory>
  </VirtualHost>

DocumentRoot 路径是正确的,因为所有已知的 url example.comsub.example.com 都可以正常工作,只是 404 是有问题的地方。

【问题讨论】:

你有Multiviews选项吗?如果是这种情况,请关闭它,因为其余部分在我看来完全没问题。 不知道该怎么做。能否详细说明。我会在每个 VirtualHost 块中添加“Options -MultiViews”吗? 我会在服务器级别执行此操作,除非您在任何其他虚拟主机上使用它。在使用服务器端脚本和重写规则时,该选项是最令人困惑的选项。 没有选项。甚至添加了Options -MultiViews 没有运气。 如果将 RewriteRule ^(.*)$ /index.php?url=$1 [L] 替换为 RewriteRule ^(.*)$ http://google.com [L] 会发生什么?似乎它不会在 SSL vhost 上重写任何内容。 【参考方案1】:

重写规则需要在https重定向之前放在&lt;VirtualHost *:80&gt;下。为什么……不确定。但这是唯一可行的方法。

<VirtualHost *:80>
  ServerName sub.example.com
  DocumentRoot /var/www/html/sub
  RewriteEngine On
  RewriteCond %REQUEST_FILENAME !-f
  RewriteCond %REQUEST_FILENAME !-d
  RewriteRule ^(.*)$ /index.php?url=$1 [L]
  RewriteCond %HTTP:X-Forwarded-Proto !https
  RewriteRule . https://%SERVER_NAME%REQUEST_URI [L,R]
</VirtualHost>

【讨论】:

【参考方案2】:

把你的重定向配置放在那里:

<VirtualHost *:80>
    ServerName blog.example.com
    Redirect / http://example.com/blog/
</VirtualHost>

在您的 .htaccess 文件中写入此代码。

RewriteEngine on
RewriteCond %HTTP_HOST ^([^\.]+)\.example\.com$
RewriteRule ^/(.*)$ http://example.com/%1/$1 [R=301,L]

【讨论】:

1) 不使用 .htaccess 文件。 Apache 说:如果您有权访问 httpd 主服务器配置文件,则应完全避免使用 .htaccess 文件。使用 .htaccess 文件会降低 Apache http 服务器的速度。您可以包含在 .htaccess 文件中的任何指令都最好设置在 Directory 块中,因为它具有相同的效果和更好的性能。 httpd.apache.org/docs/current/howto/htaccess.html ... 2) 没有解决映射 sub.example.com/some/path 到 sub.example.com?url=/some/path 的问题 好吧,它也根本没有回答这个问题。

以上是关于RewriteRules 和 ErrorDocument 规则不适用于 SSL 虚拟主机的主要内容,如果未能解决你的问题,请参考以下文章

RewriteRules 和 ErrorDocument 规则不适用于 SSL 虚拟主机

在 Apache/PHP 中显示所有活动的 RewriteRules

javascript browserSync rewriteRules SSI

htaccess - RewriteRules 声明导致 404 错误

在不使用 .htaccess 文件的情况下,我应该将 RewriteRules 放在 Apache2 的哪里?

HTACCESS RewriteRules 带有漂亮的 SEO 网址(不允许访问物理文件位置)