htaccess规则被覆盖

时间:2018-11-18 11:44:42

标签: apache .htaccess mod-rewrite

我希望Web服务器根目录中的.htaccess文件将以^assets/(.*)$开头的任何请求重定向到文件夹public/$1。所有其他请求都必须转到index.php?request=$1。在这种情况下,我还想保留get参数(使用L标志)。

RewriteEngine on

RewriteBase /

RewriteRule ^assets/(.*)$ public/$1 [QSA,L]

RewriteRule ^(?!assets)(.*)$ index.php?request=$1 [L,QSA]

唯一的问题是最后一行覆盖了前面的:/ 我也用(.*)进行了测试,但没有成功。 感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

尝试一下:

RewriteEngine on

RewriteRule "^/assets/(.*)$" "/public/$1" [L,QSA]

RewriteCond %{REQUEST_URI} "!^/assets/"
RewriteCond %{REQUEST_URI} "!^/index.php"
RewriteCond %{REQUEST_URI} "!^/public"
RewriteRule (.*) "/index.php?request=$1" [L,QSA]
  • QSA:将参数附加到重写的部分
  • L:最后。这意味着,如果匹配,则不进行任何其他重写。
  • 重写从/开始
  • 要在RewriteRule上应用条件,请使用RewriteCond

参考文献:
https://httpd.apache.org/docs/2.4/rewrite/flags.html
https://httpd.apache.org/docs/current/mod/mod_rewrite.html

第一个规则是:

  • 如果以“ / assets /”开头,第二个/之后的任何内容都将被重写为“ / public / $ 1”。

RewriteCond和RewriteRule说:

  • 如果它不是以“ / assets /”开头,则将收到的所有内容添加到“ /index.php?request=“。的末尾。
    因此http://www.example.com/directory/somepage.html将转到
    http://www.example.com/index.php?request=/directory/somepage.html
  • 如果请求中有参数,则将它们附加在末尾,如下所示: http://www.example.com/directory/somepage.html?a=1&b=4将转到
    http://www.example.com/index.php?request=/directory/somepage.html?a=1&b=4

编辑1115年11月19日

添加了第二个RewriteCond以确保“ /index.php”不会被重写为自身。第三,如果您希望“ / public”也不要重定向到“ /index.php”。