.htaccess文件导致AJAX出现404错误

时间:2013-08-13 17:50:09

标签: .htaccess jquery mod-rewrite

一切正在我的localhost上运行,其中没有使用.htaccess文件。但是当我去实际的网站时,我遇到了AJAX请求的问题。我发现导致问题的部分是删除.php扩展名。

这是我的.htaccess文件

Options +FollowSymLinks -MultiViews

RewriteEngine On
RewriteBase /

## redirect to 404 page when file does not exist
ErrorDocument 404 /404.php

## clean urls for blog.php
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+blog\.php\?title=([^\s&]+)&? [NC]
RewriteRule ^ /blog/%1? [R=302,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^blog/([\w-+]+)/?$ /blog.php?title=$1 [L]

## remove index.php
RewriteCond %{THE_REQUEST} ^.*/index.php 
RewriteRule ^(.*)index.php$ /$1 [R=301,L] 
RewriteCond %{THE_REQUEST} ^.*/index
RewriteRule ^(.*)index$ /$1 [R=301,L]

## To remove .php file extension
## RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
## RewriteRule ^ %1 [R,NC]
## RewriteCond %{REQUEST_FILENAME}.php -f
## RewriteRule ^ %{REQUEST_URI}.php

通过评论最后四行来解决问题。但我希望能够删除.php并仍然使用ajax来表示形式。

这是ajax

$.ajax({
     type:'post',
     url:'inc/example.php',
     data:$data,
     async:false,
     success:function(){
         console.log('success');
     },
     error:function(r){
         console.log(r.responseText);
     }
});

ajax中的错误功能显示我的404错误页面。我尝试从ajax请求中的url中删除.php,没有用。然后我尝试导航到inc / example.php,我得到了404页面。 .htaccess文件位于根目录下,发出ajax请求的页面是根目录下的一个目录,因此404错误发生在两个目录深处。

1 个答案:

答案 0 :(得分:2)

您需要排除重定向POST请求。您的ajax代码通过POST提交到example.php,当规则将您重定向到没有php扩展名的网址时,您将丢失请求正文。您应该使条件仅匹配GET和HEAD请求:

## To remove .php file extension
RewriteCond %{THE_REQUEST} ^(GET|HEAD)\s([^.]+)\.php [NC]
RewriteRule ^ %2 [R,NC]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php