在 Apache/PHP 中显示所有活动的 RewriteRules

Posted

技术标签:

【中文标题】在 Apache/PHP 中显示所有活动的 RewriteRules【英文标题】:Show ALL active RewriteRules in Apache/PHP 【发布时间】:2012-09-24 12:45:48 【问题描述】:

我遇到了 mod_rewrite 问题,我认为这可能是由我的 .htaccess 之外的其他配置文件中的全局规则引起的,需要查看是否有办法显示所有有效的 RewriteRules。

具体来说,我的问题是 http://mydomain.com/pages/test 工作正常(重定向到 pages/index.php),但是 http://mydomain.com/pages/test-page 返回 404 错误。任何在页面/中断后包含破折号的内容。其他一切都有效。重写规则应该是:如果找到 /pages/file.xx,则显示它。否则发送到 /pages/index.php

我的 .htaccess

重写引擎开启 RewriteBase /pages RewriteCond %REQUEST_FILENAME -f [OR] RewriteCond %REQUEST_FILENAME -d 重写规则。 - [大] 重写规则 ^([_0-9a-zA-Z-]+/)?(am-.*) $2 [L] 重写规则 ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L] RewriteCond %REQUEST_FILENAME !-f RewriteCond %REQUEST_URI !(.*)/$ 重写规则 (.*)$ /pages/$1/ [R=301,L] 重写规则 ^index\.php$ - [L] RewriteCond %REQUEST_FILENAME !-f RewriteCond %REQUEST_FILENAME !-d 重写规则 ^([a-zA-Z0-9\-_\/\s]+)/?$ /pages/index.php [L]

编辑 打开 RewriteLog 后,我得到以下 URL “domain.com/pages/test-string”:

xx.xx.xx.xx - - [03/Oct/2012:11:34:15 -0400] [domain.com/sid#17b39d20][rid#172fe530/initial] (1) [per-dir /hsphere/ local/home/domain/domain.com/pages/] 通过 /hsphere/local/home/domain/domain.com/pages/test-string xx.xx.xx.xx - - [03/Oct/2012:11:34:16 -0400] [domain.com/sid#17b39d20][rid#172fe530/initial] (1) [per-dir /hsphere/ local/home/domain/domain.com/pages/] 通过 /hsphere/local/home/domain/domain.com/splash/test-string

这是 URL “domain.com/pages/test”的结果

xx.xx.xx.xx - - [03/Oct/2012:11:37:46 -0400] [domain.com/sid#17b39d20][rid#172fe530/initial] (2) [per-dir /hsphere/ local/home/domain/domain.com/pages/] 重写测试 -> /pages/test/ xx.xx.xx.xx - - [03/Oct/2012:11:37:46 -0400] [domain.com/sid#17b39d20][rid#172fe530/initial] (2) [per-dir /hsphere/ local/home/domain/domain.com/pages/] 使用 http://domain.com/pages/test/ 显式强制重定向 xx.xx.xx.xx - - [03/Oct/2012:11:37:46 -0400] [domain.com/sid#17b39d20][rid#172fe530/initial] (2) [per-dir /hsphere/ local/home/domain/domain.com/pages/] 试图用 /pages 替换前缀 /hsphere/local/home/domain/domain.com/pages/ xx.xx.xx.xx - - [03/Oct/2012:11:37:46 -0400] [domain.com/sid#17b39d20][rid#172fe530/initial] (1) [per-dir /hsphere/ local/home/domain/domain.com/pages/] 转义 http://domain.com/pages/test/ 以进行重定向 xx.xx.xx.xx - - [03/Oct/2012:11:37:46 -0400] [domain.com/sid#17b39d20][rid#172fe530/initial] (1) [per-dir /hsphere/ local/home/domain/domain.com/pages/] 重定向到 http://domain.com/pages/test/ [REDIRECT/301] xx.xx.xx.xx - - [03/Oct/2012:11:37:46 -0400] [domain.com/sid#17b39d20][rid#172fe530/initial] (2) [per-dir /hsphere/ local/home/domain/domain.com/pages/] 重写 test/ -> /pages/index.php xx.xx.xx.xx - - [03/Oct/2012:11:37:46 -0400] [domain.com/sid#17b39d20][rid#172fe530/initial] (2) [per-dir /hsphere/ local/home/domain/domain.com/pages/] 试图用 /pages 替换前缀 /hsphere/local/home/domain/domain.com/pages/ xx.xx.xx.xx - - [03/Oct/2012:11:37:46 -0400] [domain.com/sid#17b39d20][rid#172fe530/initial] (1) [per-dir /hsphere/ local/home/domain/domain.com/pages/] 内部重定向与 /pages/index.php [内部重定向] xx.xx.xx.xx - - [03/Oct/2012:11:37:46 -0400] [domain.com/sid#17b39d20][rid#17c144e0/initial/redir#1] (1) [per- dir /hsphere/local/home/domain/domain.com/pages/] 通过 /hsphere/local/home/domain/domain.com/pages/index.php

【问题讨论】:

RewriteRule . - [L] 应该是 RewriteRule .* - [L] 为清楚起见恕我直言。最后一个字符类中的\s 应该 是多余的,因为其中包含文字空白字符的 URL应该 导致 400 错误,/ 也不会需要在 mod_rewrite 正则表达式中转义,因为它不使用显式分隔符。我怀疑这些点中的任何一个都可以解决问题,只是一般的 cmets。这个 .htaccess 文件在哪里? 这个 .htaccess 文件位于 /pages/ 子目录中。 (这是 WordPress 站点的子站点,因此可能是根 /.htaccess 文件正在影响它,但是我尝试删除根 /.htaccess 并且它仍然存在问题,这让我认为问题更高在 httpd.conf 或站点特定的 site.conf 文件中 嗯,在我看来,文件中的逻辑太多了,例如,您的第一条规则断言,如果文件存在,它将被直接提供,但以下几个规则仍然继续断言该文件不存在。我认为,您可以消除一些膨胀,这可能会使问题更容易看到。如果删除根目录中的 .htaccess 文件不影响它,则极不可能有任何其他规则在问题中起作用。 考虑这个:pastebin.com/xRVRj4Vt 减少到这个:pastebin.com/JwJigFZU 戴夫 - 感谢您的帮助,但我仍然得到与您修改的 .htaccess 相同的行为 【参考方案1】:

为RewriteLog 和 RewriteLogLevel 添加行。我会从日志级别 2 或 3 开始,因为它可能会变得很长。

【讨论】:

打开 RewriteLog 后,它似乎正试图通过带有破折号的项目:[per-dir /hsphere/local/home/domain/domainname.com/pages/] pass through /hsphere /local/home/domain/domainname.com/pages/test-string

以上是关于在 Apache/PHP 中显示所有活动的 RewriteRules的主要内容,如果未能解决你的问题,请参考以下文章

在所有活动问题中显示导航抽屉

我需要在文件“/etc/php5/apache2/php.ini”中更改哪些内容以显示错误、警告、异常?我应该如何保存我所做的更改?

所有活动中的Android导航抽屉[重复]

在 PHP 中显示错误

通过 UIActivityViewController 进行的 Facebook 共享不会在共享对话框中显示所有活动项

Apache+php显示错误信息