>Background
我正在我的本地主机 (MAMP) 上使用 PHP 创建一个时间跟踪应用程序。应用结构如下
htdocs/time-tracker/public/index.php
问题
无论我尝试多少配置,我似乎都无法避免 URL 出现某种奇怪的故障。
我需要什么
我想要以下结果。当我访问本地机器上的 url127.0.0.1:8888/time-tracker
时,我会触发 php 应用程序,通过htdocs/time-tracker/public/index.php
路由所有请求。最好没有尾部斜杠,但优先级只是让应用程序正常工作。
我当前的 .htaccess 文件
RewriteEngine On
RewriteBase /time-tracker/
RewriteRule ^public.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /public [L]
更新
1. $_GET 参数更改结果
出于某种原因,http://127.0.0.1:8888/time-tracker?debug=true
和http://127.0.0.1:8888/time-tracker
给我不同的结果。
http://127.0.0.1:8888/time-tracker?debug=true
导致重定向到http://127.0.0.1:8888/public
http://127.0.0.1:8888/time-tracker
导致重定向到http://127.0.0.1:8888/Users/etc/etc/htdocs/time-tracker/public
这些结果都不是我想要的。
2. 部分工作
每当我在 $_GET 中放入某些内容时,这个.htaccess
文件
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ public/index.php [L]
例如,127.0.0.1:8888/time-tracker/?test=test
工作,而127.0.0.1:8888/time-tracker/
仍重定向到http://127.0.0.1:8888/Users/etc/etc/htdocs/time-tracker/public
3.在root上未正确重定向
重定向适用于除根路径之外的所有路径。例如,127.0.0.1:8888/time-tracker/test
和127.0.0.1:8888/time-tracker/?test=test
都有效,只是不127.0.0.1:8888/time-tracker/
我不知道为什么我的正则表达式不会选择这个。这是我的代码
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* public/index.php [L]
4. 看到空路径名
我已经追踪到最后一个问题:空路径不会向重定向注册。
# Settings
Options +FollowSymLinks
DirectorySlash Off
RewriteEngine On
# Rules
RewriteBase /time-tracker/public/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*|x) index.php?/var=$1 [L]
出于某种原因,如果路径为空,它就无法捕获重定向。
5. 足够接近的解决方案
这是我得到的最好的。这实际上有效,但我无法解决尾部斜杠问题。
# Settings
DirectorySlash On
RewriteEngine On
# Rewrite
RewriteBase /time-tracker/public/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php?/var=$1 [L]
希望有人可以来解决尾随斜杠目录根问题,或者至少确认这是不可能的。在这一点上,正确的答案属于任何能够解释我的错误并将其变成有用的帖子的人。
在重写引擎打开后立即尝试此操作
RewriteRule ^(.*)/$ /$1 [L,R=301]
试试这个。将您的 .htaccess 文件放在时间跟踪器文件夹中
RewriteOptions inherit
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /time-tracker/public/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>