如何停止.htaccess循环

我不是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

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


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

请求是http://localhost/Test/TestScript.php被重定向到http://localhost/Test/TestScript/ ,供浏览器显示它,并最终尝试将其映射回原始资源。

正如许多人所想的那样,规则中的[L]标志并不能阻止这一过程。 重写引擎循环遍历整个规则集,按规则进行规则化,当特定规则匹配时,循环遍历相应的条件(如果有的话)。 由于每个请求都会重复此过程,并且规则会生成新请求,所以很容易进入无限循环。

这就是在这种情况下,“页面没有正确重定向”的意思。

这里是这个过程的技术细节

一些解决方案

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

  • 请求: http://localhost/Test/TestScript/
  • 内部映射到资源: 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,然后将内部重写回原始资源。

  • 请求: http://localhost/Test/TestScript.php
  • 永久和可见重定向到: http://localhost/Test/TestScript/ “漂亮”URL,
  • 内部和无声的映射回到: 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]
    

    笔记:

  • 上述选项将放置在根目录下的一个.htaccess文件中,确保启用了mod_rewrite
  • 字符串Test和TestScript被假定为动态的,可以用任何名称替换。
  • 主机名localhost是一个例子,也可以用任何其他名称替换。

  • 最有可能的循环是由于.htaccess处理中的一个怪癖,而不是你编码的任何东西。 (该怪癖是如此糟糕,同一回路会比用:-)如果它循环更令人惊讶的简单的.htaccess,不只是马上假设你有某种逻辑错误或有编码错误的东西。

    在.htaccess规则中(与httpd.conf中的规则不同),[L] ast标志从头开始。 (查看循环可能性被启用?)

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

    选项1:使用[END]标志而不是[L] ast标志在你确实希望从该子目录中的.htaccess文件完全立即退出的行上。 (问题是,[END]标志仅适用于更新的[版本2.3.9及更高版本] Apaches,并且在早期版本中甚至不会“回退”。)

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

    RewriteCond %{ENV:REDIRECT_STATUS} !^[s/]*$
    RewriteRule ^ - [L]
    

    我不是.htaccess的专家,但是你不需要在某个时候重定向?

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

    我再次不是专家。 但也许尝试检查一下:http://forums.techguy.org/web-design-development/717997-solved-htaccess-redirect-loop-problem.html

    链接地址: http://www.djcxy.com/p/67221.html

    上一篇: How to stop .htaccess loop

    下一篇: Difference between Popen.poll() and Popen.wait()