Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.htaccess重写规则以将目录类型URL结构转换为查询_Url_.htaccess_Mod Rewrite_Seo - Fatal编程技术网

.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
。请参阅我的最新答案。