htaccess 和 URL 友好

htaccess and URL friendly

我正在尝试为网站创建一个后端,以便 URL 友好地使用。我想要完成的是 http://account_name/backend 之后的所有内容都将重定向到 index.php(并且该文件将处理查询字符串),但是如果用户未登录,index.php 将重定向到 login 并且 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= [L,QSA]

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

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

实际上问题是你的第一个规则是 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 => index.php?route=backend/js/jquery.js
  2. index.php?route=backend/js/jquery.js => 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]