Mod rewrite Mod将大多数请求重写到index.php

Mod rewrite Mod将大多数请求重写到index.php,mod-rewrite,Mod Rewrite,在上面,您可以看到我尝试重定向任何不是现有目录、不是index.php并且不是要重定向到index.php的静态资源的请求?p=resourcename 我一点运气都没有。基本上,这样做的目的是将静态和旧URL重定向到新的URL,因为我刚刚重写了一个旧站点 PHP将处理重定向逻辑 目前,这段代码导致了一个内部服务器错误,我认为这是因为它被重定向循环捕获。我做错了什么?漫长的一天之后,我的大脑都快崩溃了。你忘记了变量(%{REQUEST\u FILENAME})前面的%)和一个应该重复零次或多次的

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

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

PHP将处理重定向逻辑


目前,这段代码导致了一个内部服务器错误,我认为这是因为它被重定向循环捕获。我做错了什么?漫长的一天之后,我的大脑都快崩溃了。

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


未经测试,但值得一试:

RewriteRule .* index.php?p=%{REQUEST_FILENAME} [R=301,L]
“*”部分表示要匹配1个或多个字符(任意字符)。“index.php”前面的“/”可能不是必需的,但即使您已经将RewriteBase选项设置为“/”也会使事情变得更清楚

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


编辑:正如Gumbo所说,{REQUEST_FILENAME}前面还有“%”,这段代码最终解决了我的问题

不过,谢谢你的帮助

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

沿着查询字符串传递的标志是
QSA
RewriteRule .* /index.php?p={REQUEST_FILENAME} [R=301,L]
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]