我正在尝试将 /example 重定向到示例.html在 Apache 的 httpd.conf 中,但它不起作用



这是我试图在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

相关内容

  • 没有找到相关文章

最新更新