Mod_rewrite有两个方向?

时间:2012-07-25 14:41:56

标签: apache .htaccess mod-rewrite apache2

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

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

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

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

编辑2:

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

谢谢,

约翰

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

你可以尝试与%{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]