.htaccess 将所有 URL 重定向到 public/index.php在本地主机上没有反斜杠



>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=truehttp://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/test127.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>

最新更新