【问题标题】:Apache mod_rewrite - Redirect to HTTPS except one friendly URL (Controller)Apache mod_rewrite - 重定向到 HTTPS,除了一个友好的 URL(控制器)
【发布时间】:2025-11-27 20:20:10
【问题描述】:

我有一个网站需要强制使用 HTTPS,除非特定 URL 以某种模式开头。

问题是我重定向到 index.php 以在我的系统中加载 PHP 控制器。当它重定向到 index.php 时,会再次应用重写规则,但重定向后 %{REQUEST_URI} 变为 index.php,并且可以使用 http 的 URL 被重定向到 https。

有办法解决吗?可能在内部重定向或保持 REQUEST_URI 不变后不再读取规则。

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/ok_with_http
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .* index.php [QSA,L]

【问题讨论】:

    标签: php apache mod-rewrite


    【解决方案1】:

    即使在内部重定向到index.php 之后,也可以使用%{THE_REQUEST} 代替%{REQUEST_URI} 来测试原始请求。

    根据手册:

    THE_REQUEST

    浏览器向服务器发送的完整 HTTP 请求行(例如,GET /index.html HTTP/1.1)。这不包括任何 浏览器发送的附加标头。这个值没有 未转义(解码),与下面的大多数其他变量不同。

    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteCond %{THE_REQUEST} !^[A-Z]+\ /ok_with_http(/\S*)?\s
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule .* index.php [QSA,L]
    

    请参阅我用作参考的answer

    【讨论】:

    • 非常感谢!我完全错过了这个变量,它按预期工作。拿我的积分! :)
    • 谢谢,您的解决方案对我帮助很大
    最近更新 更多