21

网站在我们无权访问.htaccess文件的网络主机上运行。但是,我想为用户友好的 URL 进行 URL 重写。

例如原始网址

www.example.com/file?q=name

预期网址

www.example.com/file/name
4

7 回答 7

16

正如其他人所说,只需使用/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 的所有“部分”)

小心包含文件,使用白名单,这样您就可以确定没有人能够加载内部文件。

于 2010-01-24T11:57:28.943 回答
5

正如 Alix Axel 建议的那样,您可以使用

www.example.com/index.php/file/name

然后您将使用$_SERVER['REQUEST_URI']该 URL 来处理。

于 2010-01-24T11:23:40.740 回答
4

最好的办法是拥有这样的 URL:

www.example.com/index.php/file/name

不过,您将重写您的 PHP 代码。

于 2010-01-24T11:06:21.187 回答
3

如果您有 Apache 服务器并启用了AcceptPathInfo,那么您可以使用您编写的 URL。然后,如果是常规文件,将使用PATH_INFO/file/name自动重写请求。/file/name/file

于 2010-01-24T12:02:05.597 回答
1

这可以单独使用 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 中。

于 2021-03-31T01:59:53.083 回答
0

或者可以在 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;
}
于 2021-09-23T10:16:48.113 回答
-1

尝试这个

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

于 2017-01-13T08:21:59.787 回答