【问题标题】:htaccess and URL friendlyhtaccess 和 URL 友好
【发布时间】:2015-12-16 16:20:31
【问题描述】:

我正在尝试为网站创建一个后端以使用 URL 友好。我想要完成的是http://account_name/backend 之后的所有内容都将被重定向到index.php(并且该文件将处理查询字符串),但如果用户未登录,index.php 将重定向到@987654326 @ 并且该 URL 应指向 login.php 文件。

此时,如果我点击http://account_name/backend,我将被重定向到http://account_name/backend/login,我看到login.php 文件,但jscss 资源未加载。这些资源被称为:

<script type="text/javascript" src="js/jquery.js"></script>

显然我遇到了一些路径问题,但我无法弄清楚。我尝试在 htaccess 中设置 RewriteBase 并在 HTML 中设置 base href 但没有运气。

另外,我应该提到,如果尝试直接访问 js,我将被重定向到

http://account_name/backend/js/jquery.js > http://account_name/backend/js/login

前面的文件在:

D:\FolderA\FolderB\AccountName\Project

后端的文件在:

D:\FolderA\FolderB\AccountName\Project\backend

这是我的虚拟主机:

<VirtualHost account_name>
DocumentRoot "D:\FolderA\FolderB\AccountName\Project"
    <Directory "FolderA">
        AllowOverride All
    </Directory>
</VirtualHost>

到目前为止,这是我的 .htaccess:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{ENV:REDIRECT_STATUS} !^[\s/]*$
RewriteRule ^ - [L]

RewriteRule ^login$ login.php [L]
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]

【问题讨论】:

  • 如何将用户重定向到&lt;path&gt;/login 页面?任何给定的规则都不应该这样做。
  • @hjpotter92 在 index.php 中,如果没有设置会话:header("location: login");
  • @hjpotter92 我也可以在地址栏输入http://account_name/backend/login

标签: apache .htaccess url mod-rewrite friendly-url


【解决方案1】:

实际上问题是你的第一条规则是ANDing 而不是ORing

# if request is for a directory AND
RewriteCond %{REQUEST_FILENAME} !-d
# if request is for a file AND
RewriteCond %{REQUEST_FILENAME} !-f
# if request has been rewritten once
RewriteCond %{ENV:REDIRECT_STATUS} !^[\s/]*$
RewriteRule ^ - [L]

显然,这条规则永远不会成功,因为一个请求不能同时针对已重写的文件和目录(%{ENV:REDIRECT_STATUS} 检查)。

由于此规则失败,您的规则实际上是循环并被重写如下:

  1. backend/js/jquery.js =&gt; index.php?route=backend/js/jquery.js
  2. index.php?route=backend/js/jquery.js =&gt; index.php?route=index.php

在第 2 步之后,mod_rewrite 停止,因为源和目标相同,即 index.php

index.php 中的代码然后重定向到 login,正如您在上面的评论中提到的那样。

为了防止这种行为,您可以使用上面@hjpotter92 建议的规则,或者在条件之间使用OR 修复您的第一条规则

RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{ENV:REDIRECT_STATUS} !^$
RewriteRule ^ - [L]

【讨论】:

    【解决方案2】:

    更新最后一条规则以重新检查文件是否存在:

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]
    

    【讨论】:

      猜你喜欢
      • 2013-02-03
      • 2015-04-17
      • 2013-08-31
      • 2012-06-03
      • 2017-04-12
      • 2015-02-27
      • 2011-05-29
      • 2013-01-22
      相关资源
      最近更新 更多