URL 重写不适用于 .htaccess
URL Rewrite not working on .htaccess
我已经在实时服务器上实现了我的小网站,但是我想对某些链接使用 url-rewrite 以使其干净。我在我的本地主机服务器上尝试这个:
http://localhost/cb/2/login.php
到 http://localhost/cb/2/login
我设法通过编辑 apache 的 httpd.conf
并启用 url-rewrite 使其在我的本地主机服务器上运行。这是我添加到 apache 的规则:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/cb/2/login$ /cb/2/login.php
</IfModule>
然而,当我将我的文件上传到实时服务器时,显然我没有编辑该服务器的 httpd.conf
的权限,所以我只是将我的重写规则放在 .htaccess
文件上,这里是内容:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/login$ /login.php [L,QSA,NC]
但是当我尝试测试它时,404 not found
是服务器的响应。我也尝试在我的本地主机服务器上实施 in 假设我无法编辑 apache 配置并且发生相同的错误,Object not found!
我不知道接下来要做什么。我是这个 url 重写规则的新手,因此非常感谢任何帮助:)
请尝试:
Options All -Indexes
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_URI} !(\.png|\.jpg|\.gif|\.jpeg|\.bmp)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) /index.php
更新
在与 OP 进行了长时间的讨论之后,幕后似乎还有很多事情要做。
最终结果是无论在 .htaccess
文件中放置什么...它都不起作用。
建议 OP 联系虚拟主机,但我会在下面为网站上的其他人留下我的原始答案。
从重写规则中删除正斜杠
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^cb/2/login$ cb/2/login.php [L,QSA,NC]
当您将本地主机放在实时服务器上时,您更改了在本地主机上使用的重写规则。假设您的目录结构相同,您应该保持重写规则相同(减去正斜杠)。
记住重写规则...
^
和 $
之间的文本是访问者将输入到 url 栏中的内容,也是您的 link 和是访问者将在 url 栏中看到的内容。
下一个块是实际文件所在的位置。
更新
如果您希望访问者转到 www.examplewebsite.com/login.php
并且希望 url 看起来像 www.example.com/login
...您的重写规则将很简单...
RewriteRule ^login$ login.php [L,QSA,NC] # Handle log-in
现在...假设您的 login.php
位于另一个名为 admin
...
的目录中
RewriteRule ^login$ admin/login.php [L,QSA,NC] # Handle log-in
这两行的意思是...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
如果 url 不是“真实”目录或 url 不是“真实”文件...然后处理规则。
这就是为什么使用 RewriteRule ^login$ index.php
会导致您的 url 被重写为 www.examplesite.com/login.php
因为无法处理重写规则(无法找到 index.php),但是 login.php 是一个“真正的”文件....所以它就可以了。
我已经在实时服务器上实现了我的小网站,但是我想对某些链接使用 url-rewrite 以使其干净。我在我的本地主机服务器上尝试这个:
http://localhost/cb/2/login.php
到 http://localhost/cb/2/login
我设法通过编辑 apache 的 httpd.conf
并启用 url-rewrite 使其在我的本地主机服务器上运行。这是我添加到 apache 的规则:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/cb/2/login$ /cb/2/login.php
</IfModule>
然而,当我将我的文件上传到实时服务器时,显然我没有编辑该服务器的 httpd.conf
的权限,所以我只是将我的重写规则放在 .htaccess
文件上,这里是内容:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/login$ /login.php [L,QSA,NC]
但是当我尝试测试它时,404 not found
是服务器的响应。我也尝试在我的本地主机服务器上实施 in 假设我无法编辑 apache 配置并且发生相同的错误,Object not found!
我不知道接下来要做什么。我是这个 url 重写规则的新手,因此非常感谢任何帮助:)
请尝试:
Options All -Indexes
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_URI} !(\.png|\.jpg|\.gif|\.jpeg|\.bmp)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) /index.php
更新
在与 OP 进行了长时间的讨论之后,幕后似乎还有很多事情要做。
最终结果是无论在 .htaccess
文件中放置什么...它都不起作用。
建议 OP 联系虚拟主机,但我会在下面为网站上的其他人留下我的原始答案。
从重写规则中删除正斜杠
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^cb/2/login$ cb/2/login.php [L,QSA,NC]
当您将本地主机放在实时服务器上时,您更改了在本地主机上使用的重写规则。假设您的目录结构相同,您应该保持重写规则相同(减去正斜杠)。
记住重写规则...
^
和$
之间的文本是访问者将输入到 url 栏中的内容,也是您的 link 和是访问者将在 url 栏中看到的内容。下一个块是实际文件所在的位置。
更新
如果您希望访问者转到 www.examplewebsite.com/login.php
并且希望 url 看起来像 www.example.com/login
...您的重写规则将很简单...
RewriteRule ^login$ login.php [L,QSA,NC] # Handle log-in
现在...假设您的 login.php
位于另一个名为 admin
...
RewriteRule ^login$ admin/login.php [L,QSA,NC] # Handle log-in
这两行的意思是...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
如果 url 不是“真实”目录或 url 不是“真实”文件...然后处理规则。
这就是为什么使用 RewriteRule ^login$ index.php
会导致您的 url 被重写为 www.examplesite.com/login.php
因为无法处理重写规则(无法找到 index.php),但是 login.php 是一个“真正的”文件....所以它就可以了。