apache重定向到裸(非www)域混淆页面处理程序

时间:2015-05-10 20:19:04

标签: apache .htaccess mod-rewrite redirect no-www

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

我一直在尝试将所有www.domain.com请求重定向到domain.com以改善搜索引擎优化等。

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

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

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


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


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

当我将规则放在当前行中时,它适用于应该通过处理程序的页面,但它使现有资源也通过它(例如domain.com/page_handler.php?page=js/script.js),这是不好的。 / p>

当我按照其他规则执行此操作后,它会将www.domain.com/something重定向到domain.com/?page=something。

所以,问题是:如何重定向以" www。"开头的网址。裸体(非www)域名而不影响其他规则?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

所以,你需要将它们向下移动,然后清理一下:

RewriteEngine on

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

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

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

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