htaccess多个条件和重写

时间:2014-04-17 13:09:48

标签: php apache .htaccess mod-rewrite

我正在尝试处理以下内容:

  1. 所有网址都转到www.mydomain.com/index.php
  2. GET参赛者仍在处理中
  3. 删除.php

    如果我有:www.mydomain.com/test.php?a = 1 我想在这里查看文件app / controllers / test.php的存在,并将字符串app / controllers / text.php传递给./index.php并从test.php中删除.php

    如果我有:www.mydomain.com/dir1/test.php?a = 1 我想在这里查看文件app / dir1 / controllers / test.php的存在 并将字符串app / dir1 / controllers / text.php传递给./index.php并从test.php中删除.php

    如果我有:www.mydomain.com/dir1/dir2/dir3/test.php?a=1 我想在这里查看文件app / dir1 / dir2 / dir3 / controllers / test.php的存在,并将字符串app / dir1 / dir2 / dir3 / controllers / text.php传递给./index.php并删除.php来自test.php

  4. 正如您所见,sub dir需要是动态的,因此需要进行DIR和FILE检查。

    所以......如果php文件test.php存在于任何目录级别

    1. 从浏览器网址中删除.php并将参数发送到www.mydomain.com/index.php,以便我可以获取文件的路径,但浏览器永远不会看到文件扩展名
    2. 如果它不存在(这部分我已经工作了) 我想继续运行我已经拥有的htaccess。 这将假设index.php在目录路径,并重定向到404,如果没有找到

      我希望它看起来像这样:

      Options +FollowSymlinks
      RewriteEngine On
      
      #Rewrite Conditions to detect actual file at path adding app/controllers 
      #to front of url string as this shouldn't be viewable
      # -- CODE I AM STUCK WORKING OUT --
      # [L] to prevent proceeding with htaccess if condition met and rewrite done
      
      # Existing code below to run if above not found
      #RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f
      #RewriteRule ^(.*)$ ./index.php?p=$1 [L,NC,QSA]
      

      由于

      d

1 个答案:

答案 0 :(得分:1)

要从网址中删除.php,您需要重定向:

RewriteRule (.*)\.php$ $1 [QSA,R=301]

现在要应用你的实际逻辑,我认为这应该有效:

RewriteRule (.*)/([^/]+)$ index.php?file=app/$1/controllers/$2.php [QSA]

然后你必须让PHP检查if( file_exists($_GET['file'])),因为你的条件太复杂而无法检入.htaccess(将controllers/插入要检查的路径中)