我正在尝试在aruba.it hosting提供的.htaccess中使用mod_rewrite, 但我有一种奇怪的行为。 我的目标是删除.php扩展名,例如:
www.mydomain.com/section/page
应加载
www.mydomain.com/section/page.php
这是我的.htaccess:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(.*)php$ [NC]
RewriteRule ^(.+)/(.+)?$ $1/$2.php?one=$1&two=$2&three=%{REQUEST_URI} [NC,L]
现在我将描述这种奇怪的行为。 如果我在浏览器中输入一个指向不的页面的URL(扩展名中的一部分),则会添加.php。
所以:
www.mydomain.com/section/sdflkjcb
sdflkjcb.php 不存在,给我(正确)此输出
在此服务器上找不到请求的URL /section/sdflkjcb.php。
请注意, .php 会添加到搜索到的页面中。
===============================
相反:
www.mydomain.com/section/page
page.php 存在,给我(奇怪的)这个输出
在此服务器上找不到请求的网址/部分/页面。
请注意,此次 .php 不。
===============================
显然:
www.mydomain.com/section/page.php
显示正确的页面。
===============================
一些注意事项:
添加或删除RewriteCond%{REQUEST_FILENAME}!-f / -d不会改变任何内容。
我不得不添加RewriteCond%{REQUEST_URI}!^(。*)php $,否则规则将以递归方式应用
我添加了?one = $ 1& two = $ 2& three =%{REQUEST_URI}只是为了检查值。添加或删除它不会改变任何内容。
谢谢。
按照@anubhava
的建议编辑于21.06.17这是另一个例子。
.htaccess only rule:
RewriteRule ^(dev/|a*)(lineup)/matchReport2/([A-Z]+)/(.+)?$ $1$2/matchReport2015.php?ID_Match=$4&MatchType=$3 [NC]
网址测试:
www.mydomain.eu/dev/lineup/matchReport2/CHM/997
作品!
===============================
.htaccess only rule:
RewriteRule ^(dev/|a*)(lineup)/matchReport2015/([A-Z]+)/(.+)?$ $1$2/matchReport2015.php?ID_Match=$4&MatchType=$3 [NC]
网址测试:
www.mydomain.eu/dev/lineup/matchReport2015/CHM/997
不起作用......
请注意,工作示例与另一个示例之间的唯一区别是 matchReport2 vs matchReport2015 。 www.mydomain.eu/dev/lineup/matchReport2015.php 是文件系统上的现有文件,而 www.mydomain.eu/dev/lineup/matchReport2 不是。到目前为止,我所做的每个测试都与此规则一致:如果URL作为文件存在(忽略扩展名),则忽略规则。
这是我可以在.htaccess文件中更改的配置吗?我无法管理Apache配置。谢谢。
答案 0 :(得分:1)
您可以使用此规则:
<IfModule mod_speling.c>
CheckSpelling off
CheckCaseOnly off
</IfModule>
Options -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1/$2.php -f
RewriteRule ^([\w-]+)/([\w-]+)/?$ $1/$2.php?one=$1&two=$2&three=%{REQUEST_URI} [QSA,L]