【问题标题】:URL Rewrite not working on .htaccessURL重写不适用于.htaccess
【发布时间】:2016-01-02 19:58:12
【问题描述】:

我已经在实时服务器上实现了我的小型网站,但是我想对某些链接使用 url-rewrite 以使其干净。我在我的本地主机服务器上试试这个:

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

我设法通过编辑 apache 的 httpd.conf 并启用 url-rewrite 使其在我的本地主机服务器上工作。这是我添加到 apache 的规则:

<IfModule mod_rewrite.c>  
  RewriteEngine on
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^/cb/2/login$ /cb/2/login.php   
</IfModule>

但是,当我将文件上传到实时服务器时,显然我没有权限编辑该服务器的httpd.conf,所以我只是将我的重写规则放在.htaccess 文件上,下面是它的内容:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/login$ /login.php [L,QSA,NC]

但是当我尝试测试它时,404 not found 是服务器的响应。我还尝试在我的本地主机服务器上实现,假设我无法编辑 apache 配置并发生同样的错误,Object not found!

我不知道接下来我会做什么。我是这个 url 重写规则的新手,所以任何帮助都将不胜感激:)

【问题讨论】:

    标签: php apache .htaccess url-rewriting


    【解决方案1】:

    更新

    在与 OP 进行了长时间讨论后,似乎还有很多事情发生在幕后。

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

    建议 OP 联系网络托管服务商,但我会在下面为网站上的其他人留下我的原始答案。


    从重写规则中删除正斜杠

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^cb/2/login$ cb/2/login.php [L,QSA,NC]
    

    当您将 localhost 放在实时服务器上时,您更改了在 localhost 上使用的重写规则。假设您的目录结构相同,您应该保持重写规则相同(减去正斜杠)。

    记住重写规则...

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

    2. 下一个块是实际文件所在的位置。

    更新

    如果您希望您的访问者转到www.examplewebsite.com/login.php,并且您希望网址看起来像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是一个“真实的”文件......所以它去了。

    【讨论】:

    • 如果我有一个示例域www.sampledomain.com,这就是我重写规则的方式吗? RewriteRule ^www.sampledomain.com/login$ www.sampledomain.com/login.php [L,QSA,NC]
    • 不,您不需要域部分。而且你不需要正斜杠。我将更新我的答案以获得进一步的解释
    • 代码现在可以在我的本地主机上运行,​​但我不知道它不能在我的托管站点上运行。这是列出的功能之一:mod_rewrite enabled (apache 2.2); full dot files support (.htpasswd, .htaccess - posibility to set custom error pages, to block unwanted ips/sites, to turn on/off indexes etc. etc.);
    • 您的登录文件的确切网址是什么?例如www.examplesite.com/login.phpwww.examplesite.com/admin/login.php ?
    • 它只是在父目录示例:www.examplesite.com/login.php.htaccess 文件
    【解决方案2】:

    请尝试:

    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
    

    【讨论】:

    • 去掉开头的斜线:RewriteRule ^(.*) index.php
    • 现在可以了,但是当我在浏览器上输入/login 时,它会重写为/login.php
    • 您需要将所有请求重定向到 index.php 并通过包含在内部处理重写,如下所示: if(!isset($_SESSION['user']) { include 'login.php'; exit;} .... 这样你就可以屏蔽你想要的任何 url 并使用 php 解析 url 参数,另一种方法是编写更复杂的 .htaccess 来解析参数。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多