.htaccess RewriteRule仅适用于数字

时间:2014-02-27 18:16:35

标签: php apache .htaccess mod-rewrite

以下是我的.htaccess文件中的内容

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

RewriteRule ^.*$ ./index.php

这会将任何不存在的目录请求重定向到我的索引页面。这适用于www.site.com/AAAwww.site.com/A1www.site.com/1A,但不适用于www.site.com/1www.site.com/123

基本上,它不适用于只有数字的请求。

对此的任何想法将不胜感激。

我也试过

RewriteRule ^[0-9]*$ ./index.php

但这也不起作用。

我将Google作为我的默认搜索引擎,因此当我输入www.site.com/1234并找不到该页面时,我会转到Google搜索结果页面,其中显示“您搜索www.site.com/1234没有匹配任何文件“ - 我认为这与404相同,但谷歌接管并将其视为搜索。

EDIT 我没想到这可能是一个浏览器问题。现在我尝试了FF Mac和IE Win,它运行正常。在Safari Mac或Safari iOS上无法正常工作。我刚刚将链接发送给更多人尝试。

2 个答案:

答案 0 :(得分:0)

我刚刚使用你在默认的虚拟主机上对空的.htaccess进行规则,请求这个

http://test.local/1

这是该请求的rewrite.log

127.0.0.1 - - [28/Feb/2014:10:31:14 +0800] [test.local/sid#a89a80][rid#7fc63c002970/initial] (3) [perdir /mnt/webs/test/] strip per-dir prefix: /mnt/webs/test/1 -> 1
127.0.0.1 - - [28/Feb/2014:10:31:14 +0800] [test.local/sid#a89a80][rid#7fc63c002970/initial] (3) [perdir /mnt/webs/test/] applying pattern '^.*$' to uri '1'
127.0.0.1 - - [28/Feb/2014:10:31:14 +0800] [test.local/sid#a89a80][rid#7fc63c002970/initial] (2) [perdir /mnt/webs/test/] rewrite '1' -> './index.php'
127.0.0.1 - - [28/Feb/2014:10:31:14 +0800] [test.local/sid#a89a80][rid#7fc63c002970/initial] (3) [perdir /mnt/webs/test/] add per-dir prefix: ./index.php -> /mnt/webs/test/./index.php
127.0.0.1 - - [28/Feb/2014:10:31:14 +0800] [test.local/sid#a89a80][rid#7fc63c002970/initial] (2) [perdir /mnt/webs/test/] strip document_root prefix: /mnt/webs/test/./index.php -> /./index.php
127.0.0.1 - - [28/Feb/2014:10:31:14 +0800] [test.local/sid#a89a80][rid#7fc63c002970/initial] (1) [perdir /mnt/webs/test/] internal redirect with /./index.php [INTERNAL REDIRECT]
127.0.0.1 - - [28/Feb/2014:10:31:14 +0800] [test.local/sid#a89a80][rid#7fc63c00be98/initial/redir#1] (3) [perdir /mnt/webs/test/] strip per-dir prefix: /mnt/webs/test/index.php -> index.php
127.0.0.1 - - [28/Feb/2014:10:31:14 +0800] [test.local/sid#a89a80][rid#7fc63c00be98/initial/redir#1] (3) [perdir /mnt/webs/test/] applying pattern '^.*$' to uri 'index.php'
127.0.0.1 - - [28/Feb/2014:10:31:14 +0800] [test.local/sid#a89a80][rid#7fc63c00be98/initial/redir#1] (1) [perdir /mnt/webs/test/] pass through /mnt/webs/test/index.php

我得到了index.php文件。它应该工作

虽然,一个小建议是改变这个

RewriteRule ^.*$ ./index.php

到这个

RewriteRule ^.*$ index.php

对您的代码不是一个很大的改动,但它删除了服务器的一个内部步骤,因为它不必解析'./'部分。

你可以做的一件事,就是确认事情按预期工作,就是把index.php文件改为:

var_dump( $_SERVER );

你应该看到这个位

'REDIRECT_URL' => string '/1' (length=2)
'REQUEST_URI' => string '/1' (length=2)
'SCRIPT_NAME' => string '/index.php' (length=10)

这意味着请求是/ 1,但正在执行的文件是index.php,这意味着重写有效。如果你得到了不同的东西,那就是调试的开始

答案 1 :(得分:0)

尝试使用

FallbackResource /index.php

而是删除重写规则。据说可以使用Apache 2.2.16+(我没有用数字测试但值得一试)。