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]
我网站中的所有网址实际上都经过 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]