【发布时间】:2017-06-20 09:31:25
【问题描述】:
我正在尝试在 aruba.it 托管提供的 .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在哪里存在,给了我(奇怪)这个输出
在此服务器上找不到请求的 URL /section/page。
请注意,.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 唯一规则:
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 唯一规则:
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 与 matchReport2015。 www.mydomain.eu/dev/lineup/matchReport2015.php 是文件系统上的现有文件,而 www.mydomain.eu/dev/lineup/matchReport2 不是.到目前为止,我所做的每一个测试都符合这个规则:如果 URL 作为文件存在(忽略扩展名),则忽略规则。
这是我可以在 .htaccess 文件中更改的配置吗?我无法管理 Apache 配置。谢谢。
【问题讨论】:
标签: .htaccess mod-rewrite url-rewriting