0

我正在寻找一种方法来简单地从 url 中删除“.php”,同时忽略 .php 之后的所有内容

所以example.com/test.php/foo/bar会变成example.com/test/foo/bar

然后在 PHP 模板中,我可以随意搜索和使用 foo 或 bar。我发现删除 .php 的所有内容都会干扰最后的变量。

更新:我通过从文件名中删除 .php 然后使用ForceType. 虽然如果我可以保留 .php 扩展名仍然很好,这样我的代码编辑器就知道如何突出显示语法:)

<FilesMatch "^test$">
    ForceType application/x-httpd-php5
</FilesMatch>

更新 2 这是我尝试成功使用的 RewriteRule,但是当我在后面添加斜杠和一些内容时,会导致 500 内部服务器错误

RewriteEngine On
RewriteBase /
# remove .php; use THE_REQUEST to prevent infinite loops
    RewriteCond %{THE_REQUEST} ^GET\ (.*)\.php\ HTTP
    RewriteRule (.*)\.php$ $1 [R=301]
# remove index
    RewriteRule (.*)/index$ $1/ [R=301]
# remove slash if not directory
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} /$
    RewriteRule (.*)/ $1 [R=301]
# add .php to access file, but don't redirect
    RewriteCond %{REQUEST_FILENAME}.php -f
    RewriteCond %{REQUEST_URI} !/$
    RewriteRule (.*) $1\.php [L]
4

2 回答 2

2

你的最后一个街区快到了。但是,您需要更多种类的RewriteConds 才能使其与可选的 PATH_INFO 一起使用。

即您需要首先匹配来自 REQUEST_FILENAME/_URI 的单词字符,然后测试是否存在同名的 .php 脚本:

RewriteCond %{REQUEST_URI}           ^/(w+)/
RewriteCond %{DOCUMENT_ROOT}/%1.php  -f
RewriteRule ^(\w+)/(.+)$ $1.php/$2   [L]

最后一个 RewriteRule 取决于现有的尾随变量。http://example.com/test为没有 PATH_INFO的普通请求添加通用规则块之一。请注意,此特定集仅适用于 webroot 中的 xyz.php 脚本。

于 2013-04-03T17:18:46.697 回答
0

请尝试重新检查:

RewriteCond %{REQUEST_URI} ^/([a-z0-9-_]+)/([a-z0-9-_]+)/([a-z0-9-_]+)/?$
RewriteRule ^(.*) ^/%1.php/%2/%3
于 2013-04-03T17:25:14.403 回答