AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 107091
Accepted
chris
chris
Asked: 2010-01-28 22:21:04 +0800 CST2010-01-28 22:21:04 +0800 CST 2010-01-28 22:21:04 +0800 CST

如何防止 apache 在“目录上下文”中重新启动重写处理

  • 772

我的虚拟主机中有以下用于 SSL 连接的内容(我的非 ssl 虚拟主机看起来相同,但没有第一个用于重定向的规则集)。

DocumentRoot /var/www/example.com/public/
<Directory "/var/www/example.com/public/">
  #only mod_rewrite configuration is shown here

  RewriteEngine on
  RewriteBase /

  RewriteCond $1 !=signup
  RewriteCond $1 !=login
  RewriteCond $1 !=welcome
  RewriteCond $1 !=thankyou
  RewriteRule ^(.*)$ http://example.com/$1 [L,R,QSA]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  RewriteRule ^(.+)$ index.php?q=$1 [L,QSA]
</Directory>

我的意图是让任何不匹配的页面请求 (signup|login|welcome|thankyou) 被重定向到非 ssl 虚拟主机而不进行进一步处理,否则不重定向,而是在 SSL 虚拟主机内处理请求。

第一个 RewriteRule 集负责重定向,而第二个 RewriteRule 集负责正常的页面处理。

如果没有第一个规则集,所有请求都会在 SSL 虚拟主机下正确加载。

使用第一个规则集,与列出的资源不匹配的重定向工作得很好。例如。请求

https://example.com/about

重定向到

http://example.com/about

但是在请求注册、登录、欢迎和感谢页面时,就会出现问题。这些请求也被重定向到非 ssl 站点,但以损坏的方式。一个请求

https://example.com/signup

重定向到

http://example.com/index.php?q=signup

似乎第一个规则集不匹配(如预期的那样),然后在处理第二个规则集后,再次应用第一个规则集(不是预期的)。

我无法将这种意外行为与任何记录的功能相匹配。

有任何想法吗?

编辑

我在文档中发现了一些模糊的引用,当规则匹配发生在“目录上下文”中时,apache 重新运行规则,但是,引用是关于 .htaccess 的。我的重写发生在我的 <VirtualHost> 标记内的 <Directory> 标记内。我目前正在测试将重写移到 <Directory> 上下文之外——这肯定会改变行为,但我还没有让它按我的需要工作。

编辑2

当规则处理存在于目录上下文中时,该问题肯定是由 apache 重新启动重写处理引起的。我已将规则处理移到 <Directory> 标记之外。但是,现在 RewriteCond 行不起作用......例如。

RewriteCond %{REQUEST_FILENAME} -f

因为 apache 尚未使用 DocumentRoot 将请求的资源解析为文件映射。真是一团糟。

因此,然后我手动将我在 DocumentRoot 中指定的值添加到 RewriteCond。然而,这似乎是一个糟糕的黑客攻击。例如。

RewriteCond /var/www/example.com/public%{REQUEST_FILENAME} -f

所以,现在我正在寻找一种方法来防止 apache 在目录上下文中重新启动重写过程,或者第二好的方法是在 <VirtualHost> 级别指定必要的 RewriteConds 的更好方法。

apache-2.2 mod-rewrite
  • 2 2 个回答
  • 589 Views

2 个回答

  • Voted
  1. Jonathan Clarke
    2010-01-29T00:39:17+08:002010-01-29T00:39:17+08:00

    我建议将以下内容添加到您的配置中,这将为您提供有关 mod_rewrite 正在做什么以及原因的详细日志。这可能有助于弄清楚你为什么会有这样的行为:

    RewriteLog /tmp/rewrite.log
    RewriteLogLevel 9
    

    完成分析后,请确保删除这些行,因为它们确实会影响性能。

    • 1
  2. Best Answer
    chris
    2010-01-31T01:53:12+08:002010-01-31T01:53:12+08:00

    我已经确定了以下解决方案,将重写放在任何 <Directory ...> 部分之外。这允许我将不应该是 SSL 的任何请求重定向到非 SSL 站点,同时允许通过 SSL 提供任何静态内容(图像、css、js 等)。

    <VirtualHost ...>
      ...
      RewriteEngine on
    
      RewriteCond $1 !=signup
      RewriteCond $1 !=login
      RewriteCond $1 !=welcome
      RewriteCond $1 !=thankyou
      RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
      RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
      RewriteRule ^/(.*)$ http://example.com/$1 [R=303,QSA,L]
    
      RewriteCond %{REQUEST_URI} !=/favicon.ico
      RewriteCond %{REQUEST_URI} !=/robots.txt
      RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
      RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
      RewriteRule ^/(.+)$ /index.php?q=$1 [QSA,L]
      ...
    </VirtualHost>
    
    • 0

相关问题

  • 阿帕奇的替代品

  • 如何强制我的网址始终以 www 开头?

  • 在 Linux Xen VPS 上优化 Apache 和 MySQL

  • mod_rewrite 不转发 GET 参数

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve