代码之家  ›  专栏  ›  技术社区  ›  pixeline

htaccess文件中重写规则的正确顺序

  •  1
  • pixeline  · 技术社区  · 15 年前

    我需要:

    http://www.example.com/v1/my-project/ 重定向到 http://example.com/my-project/

    所以:

    (1)从http_主机删除www

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

    (2)删除请求的“v1/”部分

    RewriteCond %{REQUEST_URI} ^/v1/(.*)$ [NC]
    RewriteRule . %1 [R=301,L]
    

    (3)我还想将所有404重定向到主页。

    ErrorDocument 404 /
    

    (4)最后,我的所有文档实际上都位于一个“v2/”文件夹中,该文件夹承载当前活动的网站,但我不希望“v2”位于URL中,只需“/”

    RewriteCond %{REQUEST_URI} !^/v2/ [NC]
    RewriteRule ^(.*)$ /v2/$1 [NC,L]
    

    所以,这是我的规则。我的问题是:我不管理(2):它被重定向到/(因为规则(3),我猜。我认为我的规则一定是错误的,但我似乎做不好。你能帮忙吗?

    2 回复  |  直到 15 年前
        1
  •  3
  •   chaos    15 年前

    “规则3”根本不是规则,它相对于重写器的顺序无关紧要。规则2由于其他原因失败了。我不确定它是否能解决您的问题,但是我会通过这样写来简化您的规则:

    RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
    RewriteRule (.*) http://example.com/$1 [R=301,L]
    
    RewriteRule ^v1/(.*) /$1 [R=301,L,NC]
    
    RewriteCond %{REQUEST_URI} !^/v2/ [NC]
    RewriteRule (.*) /v2/$1 [NC,L]
    
        2
  •  0
  •   Gumbo    15 年前

    您应该首先编写导致外部重定向的任何规则( R 然后是其他规则。否则,已经重写的URL可以用于外部重定向,尽管它只是用于内部重定向。

    所以我不会改变你现在的订单。