【发布时间】:2017-05-24 12:31:08
【问题描述】:
我已经阅读并测试了许多解决方案,但无法正常工作。
我需要什么?
如果用户在地址栏输入.../etc.php应该重定向到.../etc/,同样.../etc/应该可以直接访问,一些例子:
www.mysite.com/index.php->www.mysite.com/
www.mysite.com/register.php->www.mysite.com/register/
www.mysite.com/profile.php?id=123->www.mysite.com/profile/123/
如果lang参数设置为en(仅en,否则地址栏不显示lang值)它应该在root之后添加/en/,类似于:
www.mysite.com/register.php?lang=en->www.mysite.com/en/register/
www.mysite.com/index.php?lang=en->www.mysite.com/en/
我的尝试
Options -MultiViews
RewriteEngine on
RewriteBase /
# url is ONLY '/en' or '/de' -> redirect to /en/ or /lt/ (adding slash)
RewriteRule ^(en|lt)$ $1/ [R=301,L]
# now all urls have en/ lt/ -> parse them
RewriteRule ^(en|lt)/(.*)$ $2?lang=$1&%{query_STRING} [L]
# no "R=301" here --------------------------------------^
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
但上面的代码允许用户访问www.mysite.com/register.php 和www.mysite.com/register/,而它应该从www.mysite.com/register.php 重定向(更改网址)到www.mysite.com/register/
【问题讨论】:
-
试试这个条件
RewriteCond %{REQUEST_FILENAME}\.php -f -
@Nawin 如果我在
.htaccess文件的底部附加RewriteCond %{REQUEST_FILENAME}\.php -f- 什么也不会发生。如果我删除所有其他规则,只留下RewriteCond %{REQUEST_FILENAME}\.php -f,那么我可以访问www.mysite.com/register.php,但不能重定向,也不能再访问www.mysite.com/register/,所以这不起作用。 -
RewriteRule ^([^\.]+)$ $1.php [R=301,L]我想你想删除你的扩展,所以你可以试试这个 -
@Nawin 我已经用
RewriteRule ^([^\.]+)$ $1.php [R=301,L]替换了RewriteRule ^([^\.]+)$ $1.php [NC,L],但还是一样,没有删除.php扩展。 -
@anubhava 是的,可能有多个参数。
标签: php apache .htaccess redirect mod-rewrite