Php URL重写在.htaccess上不起作用

Php URL重写在.htaccess上不起作用,php,apache,.htaccess,url-rewriting,Php,Apache,.htaccess,Url Rewriting,我已经在一个实时服务器上实现了我的小网站,但是我想对一些链接使用url重写,以使其干净。我在本地主机服务器上尝试以下操作: http://localhost/cb/2/login.php至http://localhost/cb/2/login 我通过编辑apache的httpd.conf并启用url重写,使其在本地主机服务器上工作。以下是我添加到apache的规则: <IfModule mod_rewrite.c> RewriteEngine on RewriteCond

我已经在一个实时服务器上实现了我的小网站,但是我想对一些链接使用url重写,以使其干净。我在本地主机服务器上尝试以下操作:

http://localhost/cb/2/login.php
http://localhost/cb/2/login

我通过编辑apache的
httpd.conf
并启用url重写,使其在本地主机服务器上工作。以下是我添加到apache的规则:

<IfModule mod_rewrite.c>  
  RewriteEngine on
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^/cb/2/login$ /cb/2/login.php   
</IfModule>
但当我尝试测试它时,
404notfound
是服务器的响应。我还尝试在本地主机服务器上实现,假设我无法编辑apache配置,并且出现相同的错误,
找不到对象

我不知道下一步该怎么办。我不熟悉此url重写规则,因此非常感谢您的帮助:)

请尝试:

Options All -Indexes
Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_URI}  !(\.png|\.jpg|\.gif|\.jpeg|\.bmp)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) /index.php

更新

在与OP进行了长时间的讨论之后,似乎还有更多的事情在幕后进行

最终结果是无论在
.htaccess
文件中放置了什么。。。它不起作用了

OP被建议与网络主机联系,但我会将我的原始答案留在下面,留给网站上的其他人


从重写规则中删除正斜杠

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^cb/2/login$ cb/2/login.php [L,QSA,NC]
将本地主机置于实时服务器上时,您更改了在本地主机上使用的重写规则。假设目录结构相同,您应该保持重写规则相同(减去正斜杠)

记住在重写规则中

1)
^
$
之间的文本是访问者将在url栏中输入的内容,是您的链接,也是访问者将在url栏中看到的内容

2) 下一个块是实际文件存在的位置

快乐编码


更新

如果您希望访问者访问
www.examplewebsite.com/login.php
,并且希望url看起来像
www.example.com/login
。。。你的重写规则很简单

RewriteRule    ^login$    login.php    [L,QSA,NC]    # Handle log-in
现在。。。假设您的
login.php
位于另一个名为
admin
的目录中

RewriteRule    ^login$    admin/login.php    [L,QSA,NC]    # Handle log-in
这两行的意思是

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
如果url不是“真实”目录或url不是“真实”文件。。。然后处理规则


这就是为什么使用
RewriteRule^login$index.php
会导致您的url被重写为
www.examplesite.com/login.php
,因为无法处理重写规则(找不到index.php),但login.php是一个“真实”文件。。。。这就是问题所在。

删除开头斜杠:RewriteRule^(.*)index.php现在它可以工作了,但当我在浏览器上键入
/login
时,它会重写为
/login.php
您需要将所有请求重定向到index.php,并通过include在内部处理重写,类似这样的方式:if(!isset($\u SESSION['user')){包括'login.php';退出;}…这样你就可以屏蔽任何你想要的url并使用php解析url参数,另一种方法是编写一个更复杂的.htaccess来解析参数。如果我有一个示例域
www.sampledomain.com
这就是我重写规则的方式吗?
重写规则^www.sampledomain.com/login$www.sampledomain.com/login.php[L,QSA,NC]
不,您不需要域部分。您也不需要正斜杠。我将更新我的答案以进一步解释代码现在可以在我的本地主机上运行,但我不知道它在我的托管站点上不起作用。这是列出的其中一个功能:
mod_rewrite enabled(apache 2.2);完全支持点文件(.htpasswd、.htaccess-可以设置自定义错误页、阻止不需要的IP/站点、打开/关闭索引等);
登录文件的确切url是什么?例如
www.examplesite.com/login.php
www.examplesite.com/admin/login.php
?它就在父目录中示例:
www.examplesite.com/login.php
以及
htaccess
文件
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f