我正在尝试在我的RewriteRule
文件中使用.htaccess
将example.com/page重定向到example.com/page.php(或将.php
添加到任何请求的文件中没有扩展名。
我试过了:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !(.*)\.php
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^/.]+)$ $1.php [R] #I also tried ^(.+)$ with no effect
来自"Spoofing" a 404 not found error with .htaccess
我在.htaccess中没有其他RewriteRule
尝试此操作,但它仍然只是通过ErrorDocument
解析为404错误页面。如果找不到请求的页面,我尝试使用的所有其他规则也会被完全跳过。如果请求的URL解析为现有页面或目录,我指定的任何规则都有效。
我有一个Godaddy共享托管Linux服务器。我很确定我无法编辑我的httpd.conf文件。
我想知道是否有人能告诉我为什么在原始请求不是文件或目录时忽略我的RewriteRule
- 当它不存在时。
感谢您的帮助。
修改:
我现在看到,如果我去mysite.com/index.php RewriteRule工作。如果我去mysite.com/index RewriteRule不起作用。如果我去一个根本不存在的页面 - mysite.com/asdfasdfsadf那么我的RewriteRule就可以了。所以它只能在现有网址的无扩展版本上失败。
答案 0 :(得分:4)
我想,
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
应该有帮助。
RewriteBase /
仅适用于目录或位置,不适用于整个 VirtualHost !
答案 1 :(得分:2)
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !(.*)\.php
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ $1.php [R]
答案 2 :(得分:1)
我确实使用我的404错误页面提出了一个基本的解决方案。在我的htaccess中,我补充说:
ErrorDocument 404 /error/404.php
然后在404.php中,我有以下代码:
$request = $_SERVER['REQUEST_URI'];
$ext_pos = strpos($request, ".");
if (!$ext_pos){
$request = $request.".php";
header("Location: ".$protocol.$domain.$request);
}
它很有用,但遗憾的是并没有完全按照我的意愿行事。我希望所有的重写都能在.htaccess文件中工作。