如何使用RewriteRule中的子文件夹

时间:2012-09-03 14:13:51

标签: apache .htaccess mod-rewrite

我正在尝试使这个重写规则起作用。我想要的是(传入网址):

http://hostname.com/mywebsite

http://hostname.com/mywebsite/test

http://hostname.com/mywebsite/something/another

到(幕后):

http://hostname.com/app.php

http://hostname.com/app.php/test

http://hostname.com/app.php/something/another

常见的是“mywebsite”需要被忽略但url仍然显示它

以下重写规则不起作用,请帮助

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^mywebsite(.*) /app.php/$1 [QSA,L]

任何帮助都会非常好。谢谢!

1 个答案:

答案 0 :(得分:1)

我认为更可靠,更简单的解决方案如下:

考虑两种情况:

案例1:如果您想要完整的网址重定向,请使用以下重写规则

RewriteEngine On
#Redirect to app.php/the-rest-of-param
RewriteRule ^mywebsite(.*)$ http://%{HTTP_HOST}/app.php$1 [R=301,L]

请注意,网址将更改如下

http://hostname.com/mywebsitehttp://hostname.com/app.php

http://hostname.com/mywebsite/testhttp://hostname.com/app.php/test

http://hostname.com/mywebsite/something/anotherhttp://hostname.com/app.php/something/another

案例2 :如果您不想要完全重定向(即,不应更改网址),那么您需要考虑以下几点。

  1. 在这种情况下,请求的URL将被保留(即,url应该类似于http://hostname.com/mywebsite/test
  2. 由于最终用户不应该知道内容是什么,然后你do not need to bypass your request to app.php/test因此没有服务器开销,而是绕过你对app.php的请求(我将解释使用下面的PHP代码休息)
  3. 只需使用以下规则

    RewriteEngine On
    #No redirection, bypass request to app.php
    RewriteRule ^mywebsite(.*)$ app.php
    

    现在您需要获取/test/something/another等参数吗?使用以下代码块抓住它。

    $param = '';
    if (strpos($_SERVER['REQUEST_URI'], '/mywebsite') === 0) {
        //10 => length of "/mywebsite"
        $param = substr($_SERVER['REQUEST_URI'], 10);
    }
    
    echo 'URL PARAM: ' . $param;
    

    对于URL http://hostname.com/mywebsite,$ param将为空字符串

    http://hostname.com/mywebsite/test $ param将为/test

    http://hostname.com/mywebsite/something/another/1234 $ param将为/something/another/1234

    请注意,我刚刚避免了不必要的条件请求旁路,并且在没有任何参数的情况下绕过了对app.php的所有请求(因为参数与URL一起)

    您可以看到$_SERVER['REQUEST_URI']保留的值类似/something/another/1234$_SERVER['PHP_SELF']类似于/app.php/something/another/1234

    希望这可以解决您的问题...