在将此自定义 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
转发任何查询字符串。我不知道为什么这在原始上下文中有效,但从此刻起,它不再重要了。