htaccess表现不像预期

时间:2016-11-27 01:22:17

标签: regex apache .htaccess redirect mod-rewrite

我正在创建一个htaccess,我想要实现3件事:

  • 删除尾部斜杠
  • 将所有非cssicojpgjsphppng文件的请求重定向到index.php
  • 如果查询字符串不以a 开头,则
  • 将所有文件重定向到view.php

目前它看起来像这样

RewriteEngine On
RewriteBase /test/
RewriteRule ^(.*)/$ $1 [N]                                  # remove trailing slash

RewriteCond %{REQUEST_URI} !\.(css|ico|jpg|js|php|png)$     # if it isn't one of the files
RewriteRule . "index.php" [L]                               # then redirect to index

RewriteCond %{QUERY_STRING} !^a($|&)                        # if query doesn't start with a
RewriteRule . "view.php" [L]                                # then redirect to view

这样,以下测试用例应该是真的:

http://127.0.0.1/test/contact               ->         http://127.0.0.1/test/index.php
http://127.0.0.1/test/contact/              ->         http://127.0.0.1/test/index.php
http://127.0.0.1/test/contact.png           ->         http://127.0.0.1/test/view.php
http://127.0.0.1/test/contact.png?a         ->         http://127.0.0.1/test/contact.png?a

当我在this site上尝试这些时,它会向我显示这些结果。实际上,当我尝试使用网址时,它会完全断开:

http://127.0.0.1/test/contact               ->         http://127.0.0.1/test/view.php
http://127.0.0.1/test/contact/              ->         Error 500
http://127.0.0.1/test/contact.png           ->         http://127.0.0.1/test/view.php
http://127.0.0.1/test/contact.png?a         ->         http://127.0.0.1/test/contact.png?a

似乎脚本始终首先查看与查询相关的部分,尽管考虑到这一点,但/contact/打破我仍然没有多大意义。当我删除与查询相关的部分时,其余部分确实有效。

我忘记了什么吗?是否有关于我不知道的操作顺序的规则?我输错了吗?

赞赏所有输入!

P.S。我知道我必须为所有本地图像,样式表,脚本和AJAX调用添加以a开头的查询。我这样做是为了当人们在一个单独的标签中查看媒体时,我可以围绕它创建一个精美的页面,允许人们浏览服务器上公开存在的所有媒体。

1 个答案:

答案 0 :(得分:3)

您的代码问题:

  1. 首先,所有非css / js / image请求都会路由到index.php,然后没有?a的任何内容都会路由到view.php,因此最终不会使用index.php一点都不对于没有.php扩展名的任何内容,您需要在最后一条规则中使用否定条件。
  2. mod_rewrite语法不允许内联注释。
  3. 您需要在第一个规则中使用R标记来更改浏览器中的网址。
  4. 您可以在/test/.htaccess

    中使用此代码
    RewriteEngine On
    RewriteBase /test/
    
    # if not a directory then remove trailing slash
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.+)/$ $1 [L,NE,R=301]
    
    RewriteCond %{REQUEST_URI} !\.(css|ico|jpe?g|js|php|png)$
    RewriteRule . index.php [L]
    
    RewriteCond %{QUERY_STRING} !(^|&)a [NC]
    RewriteRule !\.php$ view.php [L,NC]