Mod重写了对index.php的大多数请求

时间:2009-07-20 14:17:25

标签: mod-rewrite

Options +FollowSymlinks
RewriteEngine On
RewriteBase /

##RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !\.(js|ico|gif|jpg|png|css)$ [NC]
RewriteCond %{REQUEST_FILENAME} !^index.php [NC]
RewriteCond %{REQUEST_FILENAME} !^$ [NC]
RewriteCond %{REQUEST_FILENAME} !-d

## RewriteRule ^/([a-zA-Z_+-]+).php$  index.php?p=%1 [R=301]
## RewriteRule ^/?([-a-zA-Z0-9_+]+)$ index.php?p=$1 [R=301,L]
## RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php?b={REQUEST_FILENAME}
RewriteRule * index.php?p={REQUEST_FILENAME} [R=301,L]

上面你可以看到我尝试重定向任何不是现有目录的请求,不是index.php而不是重定向到index.php的静态资源?p = resourcename

我没有运气。基本上,这样做的目的是将静态和旧的URL重定向到新的URL,因为我刚刚重写了一个旧站点。

PHP将处理重定向逻辑。

此代码导致内部服务器错误,我假设因为它在重定向循环中被捕获。我做错了什么?经过漫长的一天后,我的大脑被炒了。

3 个答案:

答案 0 :(得分:2)

未经测试,但值得一试:

RewriteRule .* /index.php?p={REQUEST_FILENAME} [R=301,L]

“。*”部分表示您要匹配1个或多个字符(其中任何一个)。并且“index.php”前面的“/”可能不是强制性的,但即使你已经将RewriteBase选项设置为“/”,也会使事情更清晰。

您可能还想在括号之间添加参数“QS”,以确保获取可能与查询一起传递的查询字符串(将是[QS,R = 301,L])。希望这有效,这有助于:)

编辑:正如Gumbo所述,“{REQUEST_FILENAME}”前面还有“%”。

答案 1 :(得分:1)

这段代码最终解决了我的问题。

感谢您的帮助。

Options +FollowSymlinks
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !index.php
RewriteRule ^/?([-a-zA-Z0-9_+]+).php$ /$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^/?([-a-zA-Z0-9_+]+)$ index.php?p=$1 [L]

答案 2 :(得分:0)

您忘记了变量(%)前面的%{REQUEST_FILENAME}和一个应该重复零次或多次的表达式(*只是一个量词):

RewriteRule .* index.php?p=%{REQUEST_FILENAME} [R=301,L]