【问题标题】:Mod_rewrite in two directions?mod_rewrite 两个方向?
【发布时间】:2012-07-25 14:41:56
【问题描述】:

现有页面称为/foo/bar.php。我所做的是重写,以便当用户键入/foobar 时,它会加载/foo/bar.php 的内容(同时将/foobar 保留在url 栏中)

但我也想要相反的情况 - 当用户点击链接或键入 /foo/bar.php 时,我希望在 url 中有 /foobar。原因是避免手动更改所有链接。

我怎么能做到这一点(如果可能没有 http 重定向,但通过一些重写魔法)?这两个规则有可能共存吗?

编辑 - 在第一次响应后,我意识到我对问题的描述不正确。 /foobar 不应该是 foobar/foo/bar.php 的串联,而是任意字符串 (/whatever)。

编辑 2:

我现在在/ .htaccess 中添加了RewriteRule ^whetever/?$ /foo/bar.php [L]。然后我在/foo .htaccess 中添加了RewriteRule bar\.php$ /whetever [R=302,L]。问题是它是一个循环引用并且失败了。

谢谢,

约翰

【问题讨论】:

    标签: apache .htaccess mod-rewrite apache2


    【解决方案1】:
    RewriteEngine On
    
    RewriteCond %{REQUEST_URI} ^/foo/[^/]+\.php$
    RewriteCond %{IS_SUBREQ} !true
    RewriteRule ^/foo/([^/]+)\.php$ /foo$1 [R,L]
    
    RewriteCond %{REQUEST_URI} ^/foo[^/]
    RewriteRule ^/foo(.*) /foo/$1.php [L]
    

    第一部分匹配/foo/something.php并将它们转换为/foosomething,但仅当它不是子请求时

    第二部分采用任何/foosometing 并将其转换为/foo/something.php,通过sub-request

    【讨论】:

    • 当我将它们放在空白 htaccess 中时,我的重写日志说 %{IS_SUBREQ} 总是错误的,即使请求是 /foosomething。并在内部循环。
    【解决方案2】:

    您可以尝试匹配%{THE_REQUEST},并且仅在实际请求针对 php 文件时才进行重定向:

    RewriteEngine On
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /foo/bar\.php
    RewriteRule bar\.php$ /whatever [R=302,L]
    
    RewriteRule ^whatever/?$ /foo/bar.php [L]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 2012-05-31
      相关资源
      最近更新 更多