.htaccess重写规则以将目录类型URL结构转换为查询
我知道这个问题已经被问过/回答过好几次了,但我似乎无法克服它。所以,我道歉 在站点开发阶段,我希望浏览器地址栏显示:.htaccess重写规则以将目录类型URL结构转换为查询,url,.htaccess,mod-rewrite,seo,Url,.htaccess,Mod Rewrite,Seo,我知道这个问题已经被问过/回答过好几次了,但我似乎无法克服它。所以,我道歉 在站点开发阶段,我希望浏览器地址栏显示:domain.com/dev/item 我希望重写规则将其更改为:domain.com/dev/index.php?p=item 我正在为此使用位于public_html目录中的.htaccess。public_html/dev中的.htaccess工作正常,配置为将所有不使用我的ip的人重定向到domain.com。我的apache版本是2.2.15,我已经确认我可以使用.hta
domain.com/dev/item
我希望重写规则将其更改为:domain.com/dev/index.php?p=item
我正在为此使用位于public_html目录中的.htaccess。public_html/dev中的.htaccess工作正常,配置为将所有不使用我的ip的人重定向到domain.com。我的apache版本是2.2.15,我已经确认我可以使用.htaccess重定向,但是顶级的.htaccess根本不起作用。以下是我使用的代码:
Options +FollowSymlinks
RewriteEngine On
RewriteRule ^dev/(.*)$ dev/index.php?p=$1 [NC]
#variations tried: ^dev/(.*)+$, ^dev/(.*)+?$
包含变体的结果是找不到404,/dev/item。从^dev/(.*)中删除dev/会导致正确的url格式,但会导致以下服务器变量:
[REDIRECT_QUERY_STRING] => p=
[REDIRECT_URL] => /404.shtml
[QUERY_STRING] => p=
[REQUEST_URI] => /dev/item
我的目标是做一个小改动,以支持对live站点和开发人员副本进行这种类型的重写。但是我不明白我做错了什么。非常感谢您的帮助。您需要在重写路径的开头指定/ 请尝试以下方法:
RewriteEngine on
RewriteBase /
# If request is for a file that does actually exist, don't rewrite.
RewriteCond %{REQUEST_FILENAME} !-f
# If request is for a directory that does actually exist, don't rewrite.
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/dev/(.*)$ /dev/index.php?p=$1 [NC]
非常感谢您的回复。我尝试了上面的代码,结果导致500个内部服务器错误。出于好奇,如果这是pita来解释的话,不用担心,为什么我的代码会导致循环?因为
RewriteRule^dev/(*)$dev/index.php中的N
?p=$1[NC]
意味着“达到此规则后,重新开始重写过程”,并且您的模式替换将再次匹配该模式。另外,您可以查看apache日志并粘贴错误消息吗?哦,我的印象是NC被视为单个命令,这并不代表任何情况。。在任何情况下,将行内注释移到它们自己的行中,在它们的重写条件之上解决500错误。但404错误仍然存在。另一件事是,im在托管服务器上,没有http.conf文件,我找不到apache错误日志。我可以获取我的服务器访问日志:[Fri Nov 12 15:07:29 2010][error][client my.ip..]文件不存在:/path/to/public_html/404.shtml[Fri Nov 12 15:07:29 2010][error][client my.ip..]文件不存在:/path/to/public_html/dev/eventOh,关于NC,你是对的。不知怎么的,我错过了。听起来好像你没有打开重写引擎<代码>重新编写引擎——此外,您实际上需要在规则和替换上处于领先/领先地位,因此至少我的回答并不完全愚蠢。:)您可能还需要提供RewriteBase
。请参阅我的最新答案。