网站在我们无权访问.htaccess
文件的网络主机上运行。但是,我想为用户友好的 URL 进行 URL 重写。
例如原始网址
www.example.com/file?q=name
预期网址
www.example.com/file/name
网站在我们无权访问.htaccess
文件的网络主机上运行。但是,我想为用户友好的 URL 进行 URL 重写。
例如原始网址
www.example.com/file?q=name
预期网址
www.example.com/file/name
正如其他人所说,只需使用/index.php/nice/looking/url
.
URL 中间的“index.php”可能看起来有点奇怪,但我认为没有 .htaccess 不可能让它看起来更好
否则,您可以要求您的主机将任何 URL 重定向到 /index.php,这样您就可以/index.php
在没有 URL 的情况下处理 URL 重写。
然后您可以使用正则表达式匹配来检测要包含的文件。
preg_match('@[/]{1}([a-zA-Z0-9]+)@', $_SERVER["PATH_INFO"], $matches)
($matches 将包含数组中 url 的所有“部分”)
小心包含文件,使用白名单,这样您就可以确定没有人能够加载内部文件。
正如 Alix Axel 建议的那样,您可以使用
www.example.com/index.php/file/name
然后您将使用$_SERVER['REQUEST_URI']
该 URL 来处理。
最好的办法是拥有这样的 URL:
www.example.com/index.php/file/name
不过,您将重写您的 PHP 代码。
如果您有 Apache 服务器并启用了AcceptPathInfo,那么您可以使用您编写的 URL。然后,如果是常规文件,将使用PATH_INFO值/file/name
自动重写请求。/file
/name
/file
这可以单独使用 Apache 配置(httpd.conf 或 apache2.conf)中的语言/内容协商以及重写规则。.htaccess
不需要使用文件。
在 apache2.conf 文件(或 httpd.conf)中添加Multiviews
指令、MultiviewsMatch
指令和重写规则:
<Directory /var/www/html>
Options Indexes FollowSymLinks Multiviews
AllowOverride None
Require all granted
RewriteEngine On
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]
<Files "*.php">
MultiviewsMatch Any
</Files>
</Directory>
然后保存文件并重新启动 Apachesudo systemctl restart apache2
如果稍后在 httpd.conf 中指定该指令,则必须为每个站点Options
重复该指令:Multiviews
<Directory /var/www/html/chocolate.com/>
Options FollowSymLinks Multiviews
AllowOverride All
Require all granted
</Directory>
<Directory /var/www/html/vanilla.com/>
Options FollowSymLinks Multiviews
AllowOverride All
Require all granted
</Directory>
如果您已经以多种语言提供服务,这不会对内容协商产生不利影响。例如,将 example.com/home.php 替换为
home.en.php home.fr.php home.de.php
然后在apache2.conf中:
AddLanguage fr .fr
AddLanguage de .de
AddLanguage en .en
LanguagePriority fr de en
ForceLanguagePriority Fallback
您的语言仍将被协商,但 php 扩展名不会出现在 URL 中。
或者可以在 index.php 文件中创建路由开关:
$request = $_SERVER['REQUEST_URI'];
switch ($request) {
case '/file' :
require __DIR__ . '/file';
break;
case '' :
require __DIR__ . '/file';
break;
case '/file/name' :
require __DIR__ . '/file?q=name';
break;
default:
http_response_code(404);
require __DIR__ . '/404.php';
break;
}
尝试这个
www.example.com/file?q=name
至
www.example.com/name
(优于www.example.com/file/name
)
.htaccess
从您的项目根文件夹中打开您的并添加此代码
Options +FollowSymLinks
RewriteEngine On
RewriteRule \.(js|css|jpe?g|png|gif)$ - [L]
RewriteRule "^([ \w-]+)/?$" /file?q=$1 [L,QSA]
这解决了你的问题。请参阅帖子如何在中重写 URL.htaccess