apache 重定向到裸(非 www)域搞乱了页面处理程序

apache redirect to naked (non-www) domain messes up pages handler

我网站中的所有网址实际上都经过 PHP 页面,该页面通过 page GET 参数处理它们(即 domain.com/sub/test 实际上是 domain.com/page_handler.php?page=sub/test)。 存在的文件或目录不通过处理程序。

我一直在尝试 301 将所有 www.domain.com 请求重定向到 domain.com 以改进 SEO 等

问题是这似乎不起作用,无论我使用什么规则以及将它放在哪里。这是 .htacess 文件:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

#THIS IS THE DISCUSSED RULE:
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/ [R=301,L]


RewriteRule (.*[^\/])$ page_handler.php?page= [QSA,NC,L]


RewriteRule ^/?$ page_handler.php?page= [L,QSA]
DirectoryIndex page_handler.php?page=

当我将规则放入当前行时,它可以正常处理本应通过处理程序的页面,但它也会使现有资源也通过它(例如 domain.com/page_handler.php?page=js/script.js),这并不好.

当我把它放在其他规则之后时,它会将 www.domain.com/something 重定向到 domain.com/?page=something.

所以,问题是:如何在不影响其他规则的情况下将以 "www." 开头的网址重定向到裸域(非 www)?

谢谢!

您的代码存在的问题是您仅将前两个条件应用于 非 www 规则。条件只能针对紧随其后的规则进行测试。

因此,您需要将它们向下移动并清理一下:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /page_handler.php?page= [QSA,NC,L]

如果这会给您带来问题,那么您可能需要更改 page 的检测方式,使用 REQUEST_URI 而不是 $_GET['page']。如果你想这样做(这实际上是一个更好的方法),最后的规则可以改为如下:

RewriteRule ^ /page_handler.php [QSA,NC,L]