【发布时间】: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.com 和 sub.example.com 都可以正常工作,只是 404 是有问题的地方。
【问题讨论】:
-
你有
Multiviews选项吗?如果是这种情况,请关闭它,因为其余部分在我看来完全没问题。 -
不知道该怎么做。能否详细说明。我会在每个 VirtualHost 块中添加“Options -MultiViews”吗?
-
我会在服务器级别执行此操作,除非您在任何其他虚拟主机上使用它。在使用服务器端脚本和重写规则时,该选项是最令人困惑的选项。
-
没有选项。甚至添加了
Options -MultiViews没有运气。 -
如果将
RewriteRule ^(.*)$ /index.php?url=$1 [L]替换为RewriteRule ^(.*)$ http://google.com [L]会发生什么?似乎它不会在 SSL vhost 上重写任何内容。
标签: apache url-rewriting virtualhost httpd.conf amazon-elastic-beanstalk