【问题标题】:htaccess RewriteRule fails if page not found如果找不到页面,htaccess RewriteRule 会失败
【发布时间】:2012-02-22 03:21:28
【问题描述】:

我正在尝试在我的 .htaccess 文件中使用 RewriteRule 将 example.com/page 重定向到 example.com/page.php(或将 .php 添加到任何没有扩展名的请求文件中.

我试过了:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !(.*)\.php
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^/.]+)$ $1.php [R]    #I also tried ^(.+)$ with no effect

来自"Spoofing" a 404 not found error with .htaccess

我在我的 .htaccess 中没有其他 RewriteRules 进行了尝试,但它仍然只是通过 ErrorDocument 解决了 404 错误页面。如果找不到请求的页面,我尝试使用的所有其他规则也会被完全跳过。如果请求的 url 解析为现有页面或目录,我指定的任何规则都有效。

我有一个 Godaddy 共享托管 Linux 服务器。我很确定我无法编辑我的 httpd.conf 文件。

我想知道是否有人可以告诉我为什么我的RewriteRules 在原始请求不是文件或目录时被忽略 - 当它不存在时。

感谢您的帮助。

编辑
我现在看到,如果我去 mysite.com/index.php RewriteRule 工作。如果我去 mysite.com/index RewriteRule 不起作用。如果我转到一个根本不存在的页面 - mysite.com/asdfasdfsadf 那么我的 RewriteRule 工作。所以它只会在现有 url 的无扩展版本上失败。

【问题讨论】:

    标签: .htaccess mod-rewrite apache


    【解决方案1】:

    我认为,

    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
    

    应该有帮助。

    RewriteBase /
    

    仅适用于 DirectoryLocation,不适用于整个 VirtualHost

    【讨论】:

    • 谢谢。我实际上已经走了一条不同的路线。我让我的 .htaccess 直观地删除扩展名,然后为所有 HTML 和 PHP 文件添加一个斜杠。然后我将它们在内部重定向到 page_load.php,然后我 include() 一个模板和请求的 URL。
    【解决方案2】:
    RewriteEngine On
    
    RewriteBase /
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !(.*)\.php
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.+)$ $1.php [R] 
    

    【讨论】:

    • 同样的结果。如果我去 mysite.com/index.php 它会加载,但如果我去 mysite.com/index 然后它会告诉我“在此服务器上找不到请求的 URL /index。”
    • 不是 100% 确定我做了什么。几个小时以来,我一直在搞乱我的 .htaccess。但我最终在RewriteEngine On 上方添加了Options -MultiViews。我还添加了RewriteBase /。这解决了我的问题。谢谢。
    【解决方案3】:

    我确实使用我的 404 错误页面想出了一个基本的解决方案。在我的 htaccess 中,我添加:

    ErrorDocument 404 /error/404.php
    

    然后在404.php中,我有以下代码:

    $request = $_SERVER['REQUEST_URI'];
    $ext_pos = strpos($request, ".");
    if (!$ext_pos){
        $request = $request.".php";
        header("Location: ".$protocol.$domain.$request);
    }
    

    不幸的是,它可以正常工作,但不能完全按照我的意愿行事。我希望所有的重写都在 .htaccess 文件中工作。

    【讨论】:

      猜你喜欢
      • 2012-07-09
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 2015-10-29
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多