【问题标题】:.htaccess not working in one case.htaccess 在一种情况下不起作用
【发布时间】: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

没有用...

请注意,工作示例与另一个示例之间的唯一区别是 ma​​tchReport2ma​​tchReport2015www.mydomain.eu/dev/lineup/matchReport2015.php 是文件系统上的现有文件,而 www.mydomain.eu/dev/lineup/matchReport2 不是.到目前为止,我所做的每一个测试都符合这个规则:如果 URL 作为文件存在(忽略扩展名),则忽略规则。

这是我可以在 .htaccess 文件中更改的配置吗?我无法管理 Apache 配置。谢谢。

【问题讨论】:

    标签: .htaccess mod-rewrite url-rewriting


    【解决方案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]
    

    【讨论】:

    • 不工作。此规则还给了我:在此服务器上找不到请求的 URL /section/page。
    • 对不起,我的输出总是一样的。请仔细阅读我所描述的内容。只是在某些情况下不添加扩展。
    • 确实如此。事实上,我写的一些奇怪的事情正在发生。例如: URL:domain.eu/dev/lineup/matchReport2/CHM/997 with Rule:RewriteRule ^(dev/|a*)(lineup)/matchReport2/([A-Z]+)/(.+)?$ $1$2/matchReport2015.php?ID_Match=$4&MatchType =$3 [NC] 有效!而是: URL:domain.eu/dev/lineup/matchReport2015/CHM/997 规则:RewriteRule ^(dev/|a*)(lineup)/matchReport2015/([A-Z]+)/(.+)?$ $1$2/matchReport2015.php?ID_Match=$4&MatchType= 3 美元 [NC] 没有!
    • 即使htaccess.mwl.be 告诉我我的规则应该有效,但它没有。仅当规则包含确切的页面文件名时,该规则才有效。这是设置还是什么?
    • 不要在 cmets 中发布代码。通过编辑问题发布您的完整 .htaccess,并清楚地写出每个未通过的测试用例以及您的预期结果。
    猜你喜欢
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多