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
文件,但未加载 js
和 css
资源。此资源被称为:
<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]
实际上问题是你的第一个规则是 AND
ing 而不是 OR
ing
# 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}
检查) .
由于此规则未通过,您的规则 实际上正在循环 并被重写为:
backend/js/jquery.js => index.php?route=backend/js/jquery.js
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]
我正在尝试为网站创建一个后端,以便 URL 友好地使用。我想要完成的是 http://account_name/backend 之后的所有内容都将重定向到 index.php
(并且该文件将处理查询字符串),但是如果用户未登录,index.php
将重定向到 login
并且 URL 应该指向 login.php
文件。
此时如果我点击 http://account_name/backend,我将被重定向到 http://account_name/backend/login,我会看到 login.php
文件,但未加载 js
和 css
资源。此资源被称为:
<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]
实际上问题是你的第一个规则是 AND
ing 而不是 OR
ing
# 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}
检查) .
由于此规则未通过,您的规则 实际上正在循环 并被重写为:
backend/js/jquery.js => index.php?route=backend/js/jquery.js
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]