.htaccess用参数替换子目录

时间:2013-10-26 19:29:01

标签: wordpress apache .htaccess mod-rewrite

我正在为网站配置.htaccess。

我想从

重写网址

http://www.example.com/search/foo/bar/baz/ ...(任意数量的子目录)

http://www.example.com/forms/index.php?i=foo--bar--baz-- ...

另一种选择是重定向所有网址

http://www.example.com/search/foo/bar/baz/ ...

http://www.example.com/forms/index.php

让index.php解析uri。

我尝试了以下mod_rewrite来实现上面的第二个替代

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.php$ /forms/index.php

但我收到404错误。

注意:不确定是否重要,但这是在Wordpress网站上发生的。整个.htaccess是

Options +FollowSymLinks

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.php$ /forms/index.php

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

任何帮助都将不胜感激。

感谢。

EDIT1:

我取得了一些进展。我在RewriteRule的末尾错过了[L]。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.php$ /forms/index.php [L]

作品。现在我需要检查/搜索网址。

EDIT2:

更多进展:

RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^search/(.*)$ http://www.example.com/forms/index.php?i=$1 [QSA,L]
它似乎工作正常。在搜索之后传递所有内容/作为参数i。

现在我还想在地址栏中显示原始网址(不是重写的网址)。这样做的任何方式?

由于

2 个答案:

答案 0 :(得分:1)

有什么效果 Rewrite ^(.*)$ forms/index.php?i=$1 [QSA,L]
应该工作

此处的关键点是^(.*)$选择并捕获任何网址,?i=$1将旧网址作为查询字符串。 QSA使旧的查询字符串附加在其他信息传递上。你可能需要这个,你可能不需要。

答案 1 :(得分:1)

如果您收到404错误,那么您可能没有打开重写模块,或者根本没有读取.htaccess文件。

这似乎不正确:

RewriteRule !^index\.php$ /forms/index.php

重写引擎层次结构是第一个找到的规则适用,其他被跳过。因此,如果您不想重写index.php,而是重写所有其他内容,您可以简单地执行Wordpress的操作:

第一行: RewriteRule ^index\.php$ - [L]&lt; - 将index.php重写为“nothing”

第二行: RewriteRule .* /index.php [L]&lt; - 将所有内容重写为index.php

因此,当请求是index.php时,Apache的行为如下:它检查第一行......“哇!匹配!所以让我们把它重写为空并加载这个文件......其他规则存档?哦,好吧。 ..我没有时间阅读它们!“

当请求不是index.php时,Apache检查第一行......“哦,好吧......不匹配......该死的......我必须阅读其他行”。检查第二行......“是的!它匹配!我不需要阅读任何其他内容,phiew!”