9

我不是 htaccess 文件方面的专家,我正在尝试一些看起来很简单但我无法做到的事情。

我搜索并最终发现这里的东西可以为我使用,但它没有。代码如下。

这是我需要的一个例子:

http://localhost/Test/TestScript.php显示这一点:http://localhost/Test/TestScript/在原始位置使用脚本。

这些是我的规则(已复制):

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /Test

## hide .php extension
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R,L,NC]

## To internally forward /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_FILENAME}.php [L]

该规则给出:

Forbidden You don't have permission to access ".../Test/TestScript.php on this server."

所以将最后一行更改为:

RewriteRule ^.*  http://localhost/Test/TestScript.php  [L]

但现在得到这个错误:

The page isn't redirecting properly

希望这个地方有才华的人可以帮助我。谢谢你。

4

3 回答 3

8

规则集以循环结束。让我们来看看:

请求被http://localhost/Test/TestScript.php重定向到http://localhost/Test/TestScript/,以便浏览器显示它,最后试图映射回原始资源。

正如许多人认为的那样,规则中的[L] 标志不会停止该过程。重写引擎逐个规则地循环通过完整的规则集,并且当特定规则匹配时,它循环通过相应的条件(如果有)。由于每个请求都会重复此过程,并且规则会生成新请求,因此很容易进入无限循环。

在这种情况下,这就是消息“页面未正确重定向”的含义。

这是此过程的技术细节

一些解决方案:

I)最好和更实用的方法是在初始请求中直接使用“漂亮”的 URL,将其静默映射到资源。这是一个一步过程,“漂亮”的 URL 始终显示在浏览器的地址栏中。此选项的优点之一是传入 URL 的 URI 路径中的任何内容都必须存在

  1. 要求:http://localhost/Test/TestScript/
  2. 内部映射到资源:http://localhost/Test/TestScript.php
Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /
# Prevent loops
RewriteCond %{REQUEST_URI} !\.php  [NC]
# Map internally to the resource, showing the "pretty" URL in the address bar
RewriteRule  ^([^/]+)/([^/]+)/?   /$1/$2.php  [L,NC]

II)如果因为已经有直接指向资源的链接而无法做到这一点,那么显示“漂亮”URL但仍从原始请求中获取数据的一种方法是首先进行可见且永久的重定向,将扩展名剥离为显示“漂亮”的 URL,然后内部重写回原始资源。

  1. 要求:http://localhost/Test/TestScript.php,
  2. 永久且可见的重定向到:http://localhost/Test/TestScript/“漂亮”的 URL,
  3. 内部和静默映射回:http://localhost/Test/TestScript.php,原始请求。
Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /

# Get the URI-path directly from THE_REQUEST variable
RewriteCond %{THE_REQUEST} ^(GET|HEAD)\s/([^/]+)/([^.]+)\.php [NC]
# Strip the extension and redirect permanently
RewriteRule  .*   /%2/%3/   [R=301,L,NC]

# Now the browser bar shows `http://localhost/Test/TestScript/`

# Prevent loops
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !\.php  [NC]
# Map internally to the original resource
RewriteRule  ^([^/]+)/([^/]+)/?   /$1/$2.php  [L,NC]

笔记:

  1. 上述选项要放在根目录下的一个 .htaccess 文件中,确保mod_rewrite已启用。
  2. 字符串TestTestScript假定是动态的,可以用任何名称替换。
  3. 主机名localhost是一个示例,也可以替换为任何其他名称。
于 2012-12-12T04:33:03.660 回答
0

该循环很可能是由于 .htaccess 处理中的一个怪癖,而不是您编写的任何内容。(怪癖是如此糟糕,以至于没有循环的简单 .htaccess比有循环的更令人惊讶:-)如果它循环,不要只是立即假设您有某种逻辑错误或错误编码。

在 .htaccess 规则中(与 httpd.conf 中的相同规则不同), [L]ast 标志从顶部开始。(看到启用的循环可能性吗?-)

一些典型的解决方案(除了上面列出的)是:

选项 1:在您确实打算完全立即退出该子目录中的 .htaccess 文件的行上,使用 [END] 标志而不是 [L]ast 标志。(问题是,[END] 标志仅在较新的 [2.3.9 及更高版本] Apache 中可用,甚至不会在早期版本中“回退”。)

选项 2:在每个 .htaccess 文件的顶部添加这样的样板代码:

RewriteCond %{ENV:REDIRECT_STATUS} !^[\s/]*$
RewriteRule ^ - [L]
于 2015-09-13T22:05:09.527 回答
-2

我不是 .htaccess 方面的专家,但您不需要在某些时候重定向吗?

如:重定向http://www.yoursite.com/test/testscript/

再说一次,我不是专家。但也许可以试试这个:http ://forums.techguy.org/web-design-development/717997-solved-htaccess-redirect-loop-problem.html

于 2012-12-12T04:36:15.240 回答