Apache2 忽略一些重写

Apache2 忽略一些重写

在将此自定义 CMS 移至新服务器后,我遇到了之前开发人员的 URL 重写问题。请观察 .htaccess 文件的以下代码片段:

RewriteEngine On

# If the URL doesn't end in a slash, redirect them to the equivalent that does (for canonical/SEO purporses)
RewriteCond %{REQUEST_URI} !.*/$
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule ^(health|nutrition|fitness|directory|coupons|download|kids|faq|signup|menu|snp|myaccount|myschool|printmenu)(.*)$ /$1$2/ [R=301,L,QSA,NS]

# Health Pages
RewriteRule ^health/$ health.php [L]
RewriteRule ^health/([^/]+)/$ health.php?title=$1 [L]
RewriteRule ^health/([^/]+)/([^/]+)/$ health_article_details.php?cat=$1&title=$2 [L]

健康重写的第一部分:

# Health Pages
RewriteRule ^health/$ health.php [L]

按预期工作,但是:

RewriteRule ^health/([^/]+)/$ health.php?title=$1 [L]
RewriteRule ^health/([^/]+)/([^/]+)/$ health_article_details.php?cat=$1&title=$2 [L]

不要将 URL 段的其余部分作为参数转发。我print_r($_REQUEST);在 health.php 的开头添加了一个,并使用 URL http://www.foo.com/health/a/b/,我得到了以下输出:

Array ()

为什么会发生这种情况而不是:

Array ( [title] => a )

任何建议都将非常感谢!

答案1

您将 放入了print_r($_REQUEST);错误的文件中。与该 URL 匹配的重写将发送到health_article_details.php

对于该 URL 你应该获得:

Array ( [cat] => a, [title] => b )

我完全不知道你为什么会得到任何东西。可能是 health_article_details.php include()s health.php。

答案2

奇怪的是,重写本不应该起作用。根据 freenode 的 #httpd 频道中某人的建议,我更改了重写,如下所示:

# Health Pages
RewriteRule ^health/$ health.php [L,QSA]
RewriteRule ^health/([^/]+)/$ health.php?title=$1 [L,QSA]
RewriteRule ^health/([^/]+)/([^/]+)/$ health_article_details.php?cat=$1&title=$2 [L,QSA]

没有QSA转发任何查询字符串。我不知道为什么这在原始上下文中有效,但从此刻起,它不再重要了。

相关内容