使用htaccess删除尾部斜杠,index.php,仍然使用相对路径

时间:2014-01-14 22:33:04

标签: php apache .htaccess mod-rewrite

我正在尝试编写一个.htaccess文件来实现以下目标:

  • 在所有网址末尾删除尾部斜杠
  • 删除index.php的文件名
  • 删除非索引的所有内容的.php扩展名
  • 保留URL中的所有尾随数据以供index.php
  • 处理
  • 使用相对URL,但没有指向站点根目录的链接,因为.htaccess只影响子文件夹(/ admin,如下例所示)

一些示例URLS(显示网址=实际位置):

  • / admin = /admin/index.php
  • / admin / pagename = /admin/pagename.php
  • / admin / directory = /admin/directory/index.php
  • / admin / one / two / three = /admin/index.php我可以用PHP解析$ _SERVER ['REQUEST_URI']以获取变量1,2和3

以下是我目前在ABOVE管理员文件夹中的内容。它删除了php扩展,同时允许我访问任何现有文件,但它也会删除.php之后的所有内容,并且不会删除尾部斜杠。

RewriteEngine On

# Redirect php filename externally
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=302,L,QSA]
# change 302 to 301 on live for perm redirect

# Redirect php filename internally
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [L,QSA]

# Rewrite Admin URLS (after specififcally looking for files)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule admin/. admin/index.php [L,QSA]
# index.php looks at $_SERVER['REQUEST_URI'] to decide what to do next

# No Directory Listings
Options -Indexes

我最关心的是能够包含相对路径的文件(.php,.inc,.css,.js),如果我能帮助它,则不必使用绝对路径。

1 个答案:

答案 0 :(得分:0)

我通常更喜欢使用提供路由功能的框架,而不是文件夹/文件的所有重写规则的噩梦。有很多PHP框架可以轻松支持这一点,例如SilexSymfonyLaravel,仅举几例。

在应用程序中进行路由更容易的另一个原因是它在大多数情况下从Web服务器抽象应用程序路由。例如,如果你转移到Nginx,你将不得不重构上述所有内容。

我的.htaccess可能如下所示:

<IfModule mod_rewrite.c>
    RewriteEngine On
    # Redirect to non-trailing slash
    RewriteRule ^(.*)/$ /$1 [R=301,L]
    # Block access to "hidden" directories whose names begin with a period.
    RewriteRule "(^|/)\." - [F]
    RewriteBase    /
    # Redirect requests that have no real file
    RewriteCond    %{REQUEST_FILENAME}  !-f
    RewriteRule    (.*)  index.php    [QSA,L]
</IfModule>