这是我试图在httpd.conf中应用的代码:
<VirtualHost *:80>
ServerName www.test.com
ServerAlias www.test.com
DocumentRoot /home/test_com
ErrorLog /home/logs/apache/www_test/www.test.com-error_log
CustomLog /home/logs/apache/www_test/www.test.com.-access_log common env=!do_not_log
# https redirect
RewriteEngine On
RewriteCond %{HTTP_HOST} www.test.com
RewriteCond %{REQUEST_URI} /example
RewriteRule . https://www.test.com/example.html [R=303,L]
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}
<Directory "/home/test_com/">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
应用代码并重新启动apache后,当我转到/example时,我得到一个404未找到响应。
当我在(https://htaccess.madewithlove.be)上测试htaccess时,输出如我所希望的https://www.test.com/example.html。我想知道是什么问题。
RewriteCond %{HTTP_HOST} www.test.com RewriteCond %{REQUEST_URI} /example RewriteRule . https://www.test.com/example.html [R=303,L]
当我去/示例,我得到一个404未找到响应。
不确定您的示例中是否丢失了某些内容,但从编写的规则来看,如果您请求/example
,它将导致重定向循环,因为它将一次又一次地重定向到/example.html
。(除非你实际上是通过HTTPS发出请求,在这种情况下,指令根本不做任何事情,你确实会得到一个404!)
这是因为第二个条件%{REQUEST_URI} /example
也匹配目标URL/example.html
。您需要使regex更具体,并且只匹配/example
,而不是仅仅包含/example
的任何URL。这个检查也可以移动到RewriteRule
指令(条件不是必需的)。例如:
RewriteRule ^/example$ https://www.test.com/example.html [R=303,L]
检查HTTP_HOST
的条件似乎没有必要,因为这些指令在www.test.com
的vHost中,所以它不能是任何其他主机名?
然而,由于该规则在端口80的vHost中,它只适用于HTTP请求(不适用HTTPS)。如果您实际上请求https://www.test.com/example
(即。HTTPS),就像你从MWL工具的测试结果所暗示的那样,那么指令永远不会被处理,你确实会得到一个404。
RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}
你的HTTP到HTTPS重定向缺少最后一部分,所以重定向到主页的一切。RewriteRule
指令应该是:
RewriteRule (.*) https://%{HTTP_HOST}$1 [R=301,L]
然而,如果你所有的指令都在vHost:80容器中,重定向到HTTPS是没有意义的。
这个规则也比它需要的更复杂。由于您在vHost:80容器中,HTTPS
将始终是off
-检查是多余的。
ServerName www.test.com ServerAlias www.test.com
如果你只有一个主机名,那么你不需要两个指令。在这种情况下,只需要ServerName
。
当我测试htaccess at (
https://htaccess.madewithlove.be
)
这里没有.htaccess
文件。您直接在vHost容器中使用指令,这是一个不同的上下文。这里的指令行为略有不同。例如,RewriteRule
模式.
(单个点)在这里的结果与在.htaccess
中使用时的结果不同。在virtualhost上下文中,它对每个请求都是成功的,而在.htaccess
中,除了主页(这可能是这里的意图),它对所有都是成功的。
然而,MWL.htaccess
测试仪只做了一个"单";请求(或单次通过文件)。它不"跟随"。重定向或多次通过文件,就像在真实服务器环境中所做的那样。所以它不能捕获重定向/重写循环——这是一个常见的错误原因。
RewriteRule的右边部分是目标文件, try change:
RewriteCond %{REQUEST_URI} /example
:
RewriteCond %{REQUEST_URI} /example.html