【问题标题】:Issue with apache mod_rewriteapache mod_rewrite 的问题
【发布时间】:2026-01-28 11:15:02
【问题描述】:

我正在尝试将所有传入请求转发到 https,除非 url 在 URL 中包含 /axis2 (http://locatlhost/axis2)。这是我写的(在我的httpd.conf file):

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/axis2$ [NC]
RewriteRule $ https://%{HTTP_HOST}%{REQUEST_URI} [L,R]

这不起作用,我无法调试原因。谁能帮帮我。

【问题讨论】:

  • 您是否尝试过从^/axis2$ 中删除起始斜线/,使其看起来像^axis2$

标签: apache mod-rewrite https url-rewriting


【解决方案1】:

您是否为端口443 设置了单独的VirtualHost

如果是,请尝试从ssl.conf / VirtualHost 指令中的VirtualHost 指令中删除__default__,该指令由ssl 设置。

应该是这样的:

<VirtualHost _default_:443>

首先,我建议您将其添加到您的VirtualHost。记录活动或mod_rewrite。这将有助于调试和更高的RewriteLogLevel 更好地进行调试。

RewriteEngine On
RewriteLog "/path/to/your/rewrite.log"
RewriteLogLevel 3

来自RewriteLogLevel Docs

要禁用重写操作的日志记录,只需将 Level 设置为 0。这将禁用所有重写操作日志。 使用较高的 Level 值会显着降低 Apache 服务器的速度!使用级别大于 2 的重写日志文件仅用于调试!


试试这个解决你的问题:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/?axis2/(?:.*)$ [NC]
RewriteRule ^(.*)(/?axis2/)(.*)$ https://$1$2$3 [L,R=301]
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI}%{QUERY_STRING} [L,QSA,R=301]

如果%{REQUEST_URI} 不是以/axis2axis2//axis2/axis2 开头和结尾,它会将您的URI 重定向到https 并停止任何进一步的规则重写。

否则,只有这个会执行:

RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI}%{QUERY_STRING} [L,R=301]

R=301 表示永久重定向。如果只指定了 R,则会进行临时重定向,即 302。

【讨论】:

  • 感谢您的回复!但是,这不起作用,要排除的 URL 将是 localhost://axis2/connector。即使我试图点击localhost/axis2 类型的 URL,它也会陷入无限循环。可能是什么问题?
  • 无限循环是什么意思?页面没有加载?
  • 是的,日志类似于:init rewrite engine with requested uri /axis2/ 应用模式 '^(.*)$' to uri '/axis2/' RewriteCond: input='/axis2/' pattern='!^/?axis2/?$' [NC] => 不匹配应用模式 '^(.*)$' 到 uri '/axis2/' 重写 '/axis2/' -> 'localhost/axis2'显式强制重定向 localhost/axis2 转义 localhost/axis2 以重定向重定向到 localhost/axis2 [REDIRECT/301] 使用请求的 uri /axis2/ 初始化重写引擎将模式 '^(.*)$' 应用到 uri '/axis2/' RewriteCond : input='/axis2/' pattern='!^/?axis2/?$' [NC] =>不是m
  • 这会进入循环,然后我的 Firefox 检测到此重定向不起作用并停止。
  • 试试上面修改过的代码。如果您通常为 ssl 指定了日志,请logs/ssl_error_log 检查它的内容。