【问题标题】:Explain .htaccess rules. Doesn't work for me解释 .htaccess 规则。不适合我
【发布时间】:2014-02-09 20:22:50
【问题描述】:

我的文件层次结构如下:

/public_html/directory/
/public_html/directory/index.php
/public_html/directory/file.php

我想将请求转发到最合适的链接。例如,

mydomain.com/directory/mydomain.com/directory/index.php

mydomain.com/directory/filemydomain.com/directory/file.php

如果出现 404 或 500 错误,则将其转发至/public_html/error.php

为此,我在.htaccess 中编写了以下代码

Options +SymLinksIfOwnerMatch -MultiViews 

# Turn mod_rewrite on
RewriteEngine On

RewriteBase /

# don't touch /forum URIs 
RewriteRule ^forums/ - [L,NC]

# hide .php extension snippet
#To externally redirect /dir/foo.php to /dir/foo 

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+).php [NC] 
RewriteRule ^ %1 [R,L]

# To internally forward /dir/foo to /dir/foo.php 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

ErrorDocument 404 /error.php 
ErrorDocument 500 /error.php

如果我提出上述请求,它会正常工作。但是如果我请求页面mydomain.com/directory/file/scrap,那么它会生成Internal Server Error

我认为这是因为file 不是目录。但我不知道如何在这里解决这个问题。请提出建议。

服务器输出的错误中还提到了最后一行关于 ErrorDocument for 500 的内容。完整的输出如下:

内部服务器错误

服务器遇到内部错误或配置错误,并且 无法完成您的请求。

请联系服务器管理员root@localhost并告知 错误发生的时间,以及您可能做过的任何事情 这可能是导致错误的原因。

有关此错误的更多信息可能在服务器错误中可用 记录。

此外,在执行过程中遇到 500 Internal Server Error 错误 尝试使用 ErrorDocument 来处理请求。

【问题讨论】:

  • example.com/directory/file/scrap的请求应该转发或重定向到什么地方?内部服务器错误应在 Apache 错误日志中详细说明。这可能是一个重定向循环,日志会显示更多细节。
  • @MichaelBerkowski 正如我上面提到的,我没有文件或目录作为 /public_html/directory/file/scrap。而不是它,我有 /public_html/directory/file.php
  • 既然不存在应该怎么办?它应该是 404,还是应该以某种方式尝试找到 directory/file.php
  • @MichaelBerkowski 它给出了 500 内部服务器错误。我认为它会找到 file.php 并尝试附加 /scrap 之类的 file.php/scrap 并生成内部服务器错误。
  • 您必须查看错误日志。 Apache 将提供有关 500 错误的详细信息,无论是 PHP 错误、重写循环还是其他原因。日志是调试 Apache 的第一站。

标签: apache .htaccess mod-rewrite redirect


【解决方案1】:

发生这种情况是因为%{REQUEST_FILENAME} -f 条件还会检查“路径信息”样式请求。所以当你请求时:

mydomain.com/directory/file/scrap

重写引擎将看到文件/directory/file.php 并假设您正在发出路径信息样式请求,例如/directory/file.php/scrap

这会导致重写引擎循环。

您需要将该条件更改为:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f

哦,同样,至于ErrorDocument 的事情,我很确定正在发生的事情是重写模块完全结束了管道中的 URL 处理。这意味着,如果 mod_rewrite 翻转并结束所有处理,则在管道的 end 应用的指令将永远不会被应用。这就是您的 ErrorDocument 指令没有被应用的原因。如果您修复了重写问题,您会注意到 500 错误文档将再次起作用。

【讨论】:

  • 谢谢朋友。它真的帮助了我。问题已解决。如果你解释这个 RewriteCond 将会非常有帮助。
  • @AbhimanyuSharma 它与您 期望 %{REQUEST_FILENAME} -f 做的事情相同,但没有路径信息。它只是获取文档根目录(例如“/var/www/localhost/htdocs”)并将请求 URI 附加到它(例如“/directory/file/scrap”),然后在末尾附加一个“.php”(例如"/var/www/localhost/htdocs/directory/file/scrap.php"),然后检查-f
【解决方案2】:

根据上面的配置,我会说/error.php有问题。

假设没有scrap.phpmydomain.com/directory/file/scrap 不会被重写。

500 错误还提到在尝试使用 ErrorDocument 时遇到了错误。

尝试使用静态 error.html 而不是动态 error.php 来缩小问题范围。

您还可以记录重写以验证它们是否正常工作:

    RewriteLogLevel 9
    RewriteLog /var/log/httpd/rewrite_log

【讨论】:

  • 我已经用静态error.html检查过了,但问题仍然存在。顺便感谢您的快速回复。
猜你喜欢
  • 2013-10-19
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多