1

我有一个重写规则来从我的页面中删除 .php 扩展名。它与我为该技术看到的每个样本几乎相同,并且我尝试了具有相同结果的变体。

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

它有效,但我有这个我无法理解的奇怪异常。

我所有的 php 文件都存储在根文件夹中,我没有子文件夹。如果我尝试使用带有子文件夹的 url,我会得到预期的 404 页面。

但是,如果我使用 php 脚本名称作为文件夹,我会收到 500 内部服务器错误。

例如,我有一个名为“logout.php”的脚本

http://example.com/eifiefj/ppp 给出 404 页面

http://example.com/logout/ppp给出 500 错误 ???????????????????

Apache错误日志说...

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.
r->uri = /logout/ppp.php.php.php.php.php.php.php.php.php.php
redirected from r->uri = /logout/ppp.php.php.php.php.php.php.php.php.php
redirected from r->uri = /logout/ppp.php.php.php.php.php.php.php.php
redirected from r->uri = /logout/ppp.php.php.php.php.php.php.php
redirected from r->uri = /logout/ppp.php.php.php.php.php.php
redirected from r->uri = /logout/ppp.php.php.php.php.php
redirected from r->uri = /logout/ppp.php.php.php.php
redirected from r->uri = /logout/ppp.php.php.php
redirected from r->uri = /logout/ppp.php.php
redirected from r->uri = /logout/ppp.php
redirected from r->uri = /logout/ppp
headers: ap_headers_error_filter()

这更像是一个“我想知道它为什么会发生”的问题。我只是看不出它为什么要继续添加 .php,肯定它应该在最后一个 RewriteCond 失败?

我很想知道这种行为是否会发生在使用删除扩展技术的其他所有人身上。

正如建议的重写日志...

add path info postfix: /var/www/public/logout -> /var/www/public/logout/ppp
strip per-dir prefix: /var/www/public/logout/ppp -> logout/ppp
applying pattern '^(.+)$' to uri 'logout/ppp'
RewriteCond: input='/var/www/public/logout' pattern='!-f' => matched
RewriteCond: input='/var/www/public/logout' pattern='!-d' => matched
RewriteCond: input='/var/www/public/logout.php' pattern='-f' => matched
rewrite 'logout/pod' -> 'logout/ppp.php'
add per-dir prefix: logout/ppp.php -> /var/www/public/logout/ppp.php
strip document_root prefix: /var/www/public/logout/ppp.php -> /logout/ppp.php
internal redirect with /logout/ppp.php [INTERNAL REDIRECT]

nb The log then basically repeats itself adding .php to the end of the filename

似乎 REQUEST_FILENAME 包含“/var/www/public/logout”,我可以看到添加 php 扩展名将符合最终规则。当然 REQUEST_FILENAME 应该是 "/var/www/public/logout/ppp" ?为什么我会丢失 /ppp ?

4

1 回答 1

1

虽然实际上并没有回答 RewriteCond 为什么失败的问题,但我发现了一组实际上克服了文件夹/脚本问题的规则。我在这里复制它以帮助任何寻求功能脚本的人。

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

此 RewriteRule 仅适用于名称不包含句号的文件,即没有扩展名的文件。

于 2013-10-23T13:11:05.353 回答