我网站上的所有网址实际上都是通过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)域名而不影响其他规则?
谢谢!
答案 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]