1

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

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]

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

4

1 回答 1

1

我认为一个更可靠且非常简单的解决方案如下:

考虑以下两种情况:

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

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

请注意,URL将更改如下

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:如果您不想要完全重定向(即不应更改 URL),那么您需要考虑以下几点。

  1. 在这种情况下,请求的 URL 将被保留(即 url 应该类似于http://hostname.com/mywebsite/test
  2. 由于最终用户不应该知道内部发生了什么,do not need to bypass your request to app.php/test因此您没有服务器开销,而是绕过您对 app.php 的请求(我将在下面用 PHP 代码解释其余部分)

只需使用以下规则

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

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

于 2012-09-06T19:32:47.153 回答