htaccess目录,文件和变量

时间:2011-08-03 12:21:46

标签: file .htaccess variables directory

我想尝试类似于$ _SERVER [“PATH_INFO”],但奇怪的服务器问题阻止我使用它......

在我的应用程序中,链接看起来像

www.domain.com/folder/file/variable
www.domain.com/folder/file
www.domain.com/file/variable or
www.domain.com/file/

使用.htaccess,我试图找到正确的页面,而不是重定向到index.php或类似的。

到目前为止,我有这个,这是行不通的:)。

RewriteRule ^(.+)$ /$1.php # page only
RewriteRule ^(.+)/(.+)$ /$1.php?x=$2 # page + variable
RewriteRule ^(.+)/(.+)$ /$1/$2.php # folder / page 
RewriteRule ^(.+)/(.+)/(.+)$ /$1/$2.php?x=$3 # folder / page + variable

我确信我需要使用RewriteCond%{REQUEST_FILENAME} -f来检查请求是文件名还是目录......但我无法使其正常工作......

变量可以包含所有奇怪的字符 - 这就是我与点匹配的原因...也许我应该尝试将文件/文件夹名称与az匹配(因为我不认为它们将包含除az,_或 - )。

任何帮助都非常感谢,因为它现在几乎是两天的痛苦:)

3 个答案:

答案 0 :(得分:1)

将最重要的重写规则反转到第一个。

RewriteEngine On
RewriteRule ^(.+)/(.+)/(.+)$ /$1/$2.php?x=$3 [L]

# RewriteRule to check that the file is exists here
RewriteCond %{REQUEST_URI} ^(.+)/(.+)$
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI}.php -f
RewriteRule ^(.+)/(.+)$ /$1/$2.php [L]

# If file is not exists, then check by put to the variable
RewriteRule ^(.+)/(.+)$ /$1.php?x=$2 [L]
RewriteRule ^(.+)$ /$1.php [L]

答案 1 :(得分:0)

大多数人/框架会将没有指定扩展名的所有内容传递给单个php前端控制器,然后确定要执行的操作。我认为大多数人走这条路的一个原因是因为简单的mod_rewrite是多么复杂!

答案 2 :(得分:0)

感谢@ LazyOne的提示,我能够解决这个问题。

htaccess文件现在看起来像这样:

RewriteRule ^([-a-zA-Z0-9_]+)/([-a-zA-Z0-9_]+)/([-a-zA-Z0-9_]+)$ /$1/$2.php?x=$3
RewriteRule ^([-a-zA-Z0-9_]+)/([-a-zA-Z0-9_]+)/$ /$1/$2.php
RewriteRule ^([-a-zA-Z0-9_]+)/([-a-zA-Z0-9_]+)$ /$1.php?x=$2
RewriteRule ^([-a-zA-Z0-9_]+)/$ /$1.php

所有文件夹或文件路径必须以“/”结尾,而变量则不能。这在我的框架中不是问题 - 但可能对其他人没用。