htaccess ErrorDocument并不总是重定向

时间:2013-11-04 18:12:39

标签: .htaccess mod-rewrite http-status-code-404 errordocument

如果发现404未找到错误,我有重定向到404自定义页面的基本代码,但这并不总是按预期工作。我还有一条规则来重写将page/foo/bar重定向到page.php?var1=foo&var2=bar

的网址

对此的规则如下:

<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule .* - [L]
    RewriteRule ^page/(.*)/(.*)$ page.php?var1=$1&var2=$2 [L]
</IfModule>

所以,这非常有效,我可以检索这两个变量。但是,如果我在URL栏page/a中写入错误,则会显示错误消息500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request.消息显示错误是由ErrorDocument规则引起的。如果我键入一个不存在的URL,ErrorDocument可以正常工作,但在这种情况下,它不会。

我还想提一下,如果我写page/a而不是写page/a/,那么错误就会消失。因此,仅当我在网址中传递一个参数且没有/时才会抛出错误。

对于任何其他现有页面aboutcontacts等,我可以轻松地添加或删除/.htaccess自动将我重定向到正确的页面,没有/

这是修改删除扩展程序的网址和/

的代码
# ------------------------------------------------------------------------------
# | Remove the slash                                                           |
# ------------------------------------------------------------------------------
<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]+)/$ $1 [R=301,L]
</IfModule>

# ------------------------------------------------------------------------------
# | Redirect to extensionless url                                              |
# ------------------------------------------------------------------------------
<IfModule mod_rewrite.c>
    RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
    RewriteRule ^(.+)\.php$ $1 [R=301,L]
</IfModule>

这是ErrorDocument的代码:

ErrorDocument 404 /boilerplate/template/404.php

最后,Apache错误日志中的消息:

[core:error] [pid 4400:tid 1672] [client ::1:65310] AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.  

修改

这是关于重写的整个部分

# ##############################################################################
# # URL REWRITES                                                               #
# ##############################################################################
# ------------------------------------------------------------------------------
# | Rewrite engine                                                             |
# ------------------------------------------------------------------------------


<IfModule mod_rewrite.c>
    Options +FollowSymlinks
  # Options +SymLinksIfOwnerMatch
    RewriteEngine On
 RewriteBase /boilerplate
</IfModule>


# ------------------------------------------------------------------------------
# | Remove the slash                                                           |
# ------------------------------------------------------------------------------
<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]+)/$ $1 [R=301,L]
</IfModule>

# ------------------------------------------------------------------------------
# | Redirect to extensionless url                                              |
# ------------------------------------------------------------------------------
<IfModule mod_rewrite.c>
    RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
    RewriteRule ^(.+)\.php$ $1 [R=301,L]
</IfModule>

# ------------------------------------------------------------------------------
# | Pretty urls                                                                |
# ------------------------------------------------------------------------------
<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule .* - [L]
    RewriteRule ^about/([^/]+)(?:/([^/]*))?/?$ about.php?var1=$1&var2=$2 [L,NC,QSA]
</IfModule>

<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.*)$ $1.php [L]
</IfModule>

编辑2

所以,除了这些规则之外,我删除了.htaccess中的所有内容。什么也没有变。我清除了cookie,清空了缓存并清除了所有浏览器历史记录。此外,我尝试与其他浏览器,同样的事情发生。为了清楚起见,我没有另一个.htaccess文件,原始文件包含来自HTML5 Boilerplate的其他代码段,例如缓存,压缩和其他非重写相关。现在我将文件剥离到这几行。

    Options +FollowSymlinks
    Options +SymLinksIfOwnerMatch
    RewriteEngine On
    RewriteBase /boilerplate

# ------------------------------------------------------------------------------
# | Redirect to extensionless url                                              |
# ------------------------------------------------------------------------------

    RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
    RewriteRule ^(.+)\.php$ $1 [R=301,L]


# ------------------------------------------------------------------------------
# | Pretty urls                                                                |
# ------------------------------------------------------------------------------

    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule .* - [L]
    RewriteRule ^page/([^/]+)(?:/([^/]*))?/?$ page.php?var1=$1&var2=$2 [L,NC,QSA]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.*)$ $1.php [L]

1 个答案:

答案 0 :(得分:1)

用以下内容替换您的页面规则:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^page/([^/]+)(?:/([^/]*))?/?$ page.php?var1=$1&var2=$2 [L,NC,QSA]