【问题标题】:URL rewrite : internal server errorURL 重写:内部服务器错误
【发布时间】:2013-11-06 10:13:28
【问题描述】:

我对 Apache 的重写规则有点问题

这是我的规则

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteRule query/(.*) /php/query.php?name=$1 [L]
RewriteRule page/(.*) /php/page.php?page=$1 [L]

完美运行。但是当我尝试添加以下规则来重写与前两个规则不匹配的 URL 时

RewriteRule .* /php/page.php?page=home

服务器响应“内部服务器错误”。为什么?

【问题讨论】:

  • 查看服务器的错误日志! (很可能你在这里创建了一个无限重定向,因为.* 当然也匹配php/page.php。)
  • .*之前的第二条规则匹配
  • 不,不适用于/php/page.php?page=home的(内部)请求
  • 规则存储在 .htaccess 文件中。文档说在这种情况下重写的请求会再次传递给引擎。

标签: apache mod-rewrite url-rewriting


【解决方案1】:

您可以使用RewriteLog 查看发生了什么,但即使使用[L],您也可以确保始终根据规则集重新检查重写的网址(这称为内部重定向)。

所以在最后的全部内容之前添加一些RewriteCond,或者阻止它在内部重定向上运行,这样:

RewriteCond %{ENV:REDIRECT_STATUS} ^$

您还可以在最终的 catch-all 上添加 [NS][nosubreq] 标签,效果相同。

但是阻止您的内部重定向规则也意味着它将永远不会在任何先前的规则之后应用,并且有一天您可能会想要它。所以要小心接下来的规则。

【讨论】:

    【解决方案2】:

    谢谢!

    最后,这是我的解决方案:

    Options +FollowSymLinks
    RewriteEngine On
    
    RewriteBase /
    
    RewriteRule query/(.*) /php/query.php?name=$1 [L]
    RewriteRule page/(.*) /php/page.php?page=$1 [L]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ page/home [L,R]
    RewriteRule ^$ page/home [NS,R]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多