【问题标题】:Url rewriting using .htaccess.What to do?使用 .htaccess 重写 URL。怎么办?
【发布时间】:2012-12-02 14:23:19
【问题描述】:

抱歉标题不好。 我现在正在使用

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

使用localhost/home 时效果很好 但我的问题是在输入localhost/home.php 时它也可以工作。我想在输入localhost/home.php 时重定向到请求页面不存在的错误页面。

我怎么能用 .htaccess 来做呢,还是应该用 php 来重定向?

【问题讨论】:

    标签: php .htaccess url redirect rewrite


    【解决方案1】:

    当您请求带有“.php”扩展名的 URL 时,您的 .htaccess 条件都不满足,因此服务器 (Apache) 只是正常处理请求。这就是它起作用的原因。

    我认为最简单的方法是在前一个规则之前添加另一个规则:

    RewriteCond %{REQUEST_URI} \.php$ # if it ends in .php
    # note we're using REQUEST_URI above to only match when
    # the URI ends in .php, not the requested file,
    # otherwise we would have a endless loop!
    RewriteRule ^(.*)$ /error_page.php # note the leading slash
    

    如果您希望浏览器重定向(并且我认为您需要添加完整路径),请将[R] 选项添加到RedirectRule,例如:

    RewriteRule ^(.*)$ /path/error_page.php [R]
    

    【讨论】:

    • 在 RewriteCond %{REQUEST_FILENAME} \.php$ RewriteRule ^(.*)$ localhost/error [R] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{ REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php
    • 不要将localhost(主机名)放在重写中,只需以/ 开头。
    • 如果这仍然不起作用,请尝试添加L 选项(即[R,L]),但我怀疑它是否需要它
    • 哦,糟糕,我看到了问题,给我一分钟
    • 不得不尝试修复它。更新了答案。在第一个条件下将REQUEST_FILENAME 更改为REQUEST_URI,并将前导斜杠添加到RewriteRule
    【解决方案2】:

    如果 REQUEST_FILENAME 不是目录,您正在做的是将“.php”附加到它,并且如果将“.php”添加到它会导致现有页面。当您键入localhost/home.php 时,不会触发重写,因为它找不到localhost/home.php.php。所以对于第二种情况,重写是完全无关的。您可能需要检查是否正确设置了对 404 情况的正常处理。例如,您是否配置了ErrorDocument 指令?然后您可能会考虑删除-f 条件并让它重定向到home.php.php,这当然会失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-04
      • 2011-04-03
      • 2014-12-23
      • 2015-01-25
      • 1970-01-01
      相关资源
      最近更新 更多