[英]apache redirect to naked (non-www) domain messes up pages handler
我网站上的所有网址实际上都经过一个由page
GET参数处理的PHP页面(即domain.com/sub/test
实际上是domain.com/page_handler.php?page=sub/test
)。 存在的文件或目录不会通过处理程序。
我一直试图将所有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/$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
),这不好。
当我将其放在其他规则之后时,它会将www.domain.com/something重定向到domain.com/?page=something。
因此,问题是:如何重定向以“ www”开头的网址。 裸域(非www)域,而不影响其他规则?
谢谢!
您的代码的问题在于,您仅将前两个条件应用于非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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.