【问题标题】:Mod_rewrite rules from root根目录下的 Mod_rewrite 规则
【发布时间】:2012-04-16 13:58:59
【问题描述】:

这个问题已经困扰我一段时间了。

我创建了一个小型网站引擎,我正在使用 mod_rewrite 告诉引擎要处理哪个页面,SEO 友好链接是一个奖励:)。

这就是今天的工作方式:

地址http://www.example.com/site/page 变成http://www.example.com/engine.php?address=page

但我想要的是: 地址http://www.example.com/page 变成http://www.example.com/engine.php?address=page

如果我为调用 (/site) 创建一个伪目录,一切正常,但是当我尝试从根目录执行相同操作时,奇怪的事情开始发生。

RewriteBase /
RewriteRule ^site/(.*) engine.php?%{QUERY_STRING}&address=$1

工作正常:/site/about/contacts 变为 eninge.php?address=about/contacts

RewriteBase /
RewriteRule ^(.*)$ eninge.php?%{QUERY_STRING}&address=$1

不起作用,由于某种原因 /about/contacts 变成 eninge.php?address=eninge.php

【问题讨论】:

    标签: apache mod-rewrite


    【解决方案1】:

    (.*) 表示捕获任何东西。你有没有试过在你的包罗万象之前排除文件和目录?因为没有它会导致无限递归。

    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ eninge.php?%{QUERY_STRING}&address=$1 [L]
    

    更多信息见官方文档:http://httpd.apache.org/docs/current/mod/mod_rewrite.html

    更新:您还应该在规则末尾指定[L],以告诉 Apache 在这里结束重写过程。

    【讨论】:

    • 做到了 :),丢失的是 [L] 标志 :)。干杯。
    • 工作正常,但是。我还想让 www.example.com/ (和 www.example.com)重定向到 example.com/engine.php?address=index
    • 如果您想保留engine.php,只需将其添加到您的DirectoryIndex 文件列表即可。
    【解决方案2】:

    查看RewriteLog(这已在 2.4 中更新,如果不使用 2.2,请查看当前文档):

    RewriteLog "/usr/local/var/apache/logs/rewrite.log"
    RewriteLogLevel 3 
    

    这将准确地向您展示mod_rewrite 正在做什么,并允许您根据其输出调整您的配置。请注意 - 它的增长速度非常快,永远不应在生产环境中使用。

    顺便说一句,您的帖子中有一些拼写错误 - 值得验证这些与您的配置不同。

    【讨论】:

    • RewriteLog,我一直在寻找类似的东西。谢谢。更正了一些错别字:)
    【解决方案3】:
    RewriteCond %{REQUEST_FILENAME} !^engine.php
    RewriteRule (.*) engine.php?address=$1 [QSA,L]
    

    试试这个。您所拥有的是导致重写循环并首先按照您的预期执行engine.php?address=about/contacts,然后再次执行并将其重写为engine.php?address=engine.php。说得通? [QSA,L] 是一个 Query String Append 和 Last 标志,它将查询字符串添加到您的 URL 并告诉重写引擎停止寻找重写。 RewriteCond %{REQUEST_FILENAME} !^engine.php 是通过确保当前 URL 不以 engine.php 开头来检查您是否尚未指定引擎重写。如果您将其写入 .htaccess 文件而不是 .httpd 配置文件,则这是必需的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多