Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP用.htaccess重写URL_Php_.htaccess_Url_Mod Rewrite_Url Rewriting - Fatal编程技术网

PHP用.htaccess重写URL

PHP用.htaccess重写URL,php,.htaccess,url,mod-rewrite,url-rewriting,Php,.htaccess,Url,Mod Rewrite,Url Rewriting,我正在尝试使用.htaccess重写URL。这些都是我想重写的东西 从URL中删除文件扩展名 通过URL传递参数并在文件中获取它 我当前的.htaccess文件如下所示 RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php [NC,L] RewriteRule ^(.*)$ works?v=$1 [NC,L] 这

我正在尝试使用.htaccess重写URL。这些都是我想重写的东西

从URL中删除文件扩展名 通过URL传递参数并在文件中获取它 我当前的.htaccess文件如下所示

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [NC,L]
RewriteRule ^(.*)$ works?v=$1 [NC,L]
这将重写并删除文件扩展名http://example.com/file.php 到http://example.com/file

我想向页面发送一些数据,可能是字符串

比方说http://example.com/file2.php?v=something

我想把它改写成http://example.com/file2/something 并获取文件中的值

我尝试了以下方法

如果我一个接一个地尝试,就会抛出以下错误

[Sat Aug 03 12:13:12.881757 2019][core:alert][pid 23832:tid 1912] [client::1:62842]路径/to/htaccess/file/.htaccess: 重写规则:错误的标志分隔符

我试图阻止那个错误,但它把我抛到了错误之下

[Sat Aug 03 13:14:02.121514 2019][core:error][pid 23832:tid 1916] 20023给定路径位于根路径上方:[客户端::1:51899] AH00127:无法映射获取 /path/to/my/file2?v=something.php HTTP/1.1 to file

我认为这是因为.htaccess正在将值重写为.php文件


如何隐藏文件扩展名并同时获取值?

我想这就是您要寻找的:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^/?([^/]+)/?$ /$1.php [END]

RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} ^/([^/]+)/([^/]+)/?$
RewriteRule ^ /%1.php?v=$2 [END]
这当然可以根据您的具体情况进一步细化。你的问题在几点上有点含糊。但是上面的例子应该为你指出正确的方向

如果您使用上述规则收到内部服务器错误http status 500,那么很可能您操作的是非常旧版本的apache http服务器。在这种情况下,您将在http服务器错误日志文件中看到不受支持的[END]标志的明确提示。您可以尝试升级或使用较旧的[L]标志,在这种情况下,它可能会起同样的作用,不过这取决于您的设置

此规则同样适用于http服务器主机配置或动态配置文件.htaccess文件。显然,重写模块需要在http服务器中加载,并在http主机中启用。如果使用动态配置文件,则需要注意在主机配置中启用该文件的解释,并且该文件位于主机的文档根文件夹中


此规则同样适用于http服务器主机配置或动态配置文件.htaccess文件。显然,重写模块需要在http服务器中加载,并在http主机中启用。如果使用动态配置文件,则需要注意在主机配置中启用该文件的解释,并且该文件位于主机的文档根文件夹中

您得到的第一个错误与规则无关,而是您在规则末尾使用的标志。您使用了哪些标志?首先,我使用了RewriteRule^.*$works?v=$1[NC,L],它抛出了第一个错误。所以我把它改成了RewriteRule^.*$works?v=$1[L,R=301,NC]这是第二个错误,你看到这篇文章了吗?是的,通过检查这个,我改变了它。这对我来说有点有效,现在它没有显示500个错误。但服务器将file2/something作为文件夹。我所有的CSS和JS都使用这个URL。像这个路径/to/file2/something/css/base.css和im GET-path/to/file2/something/css/base.css net::ERR_中止404控制台中找不到错误。这应该只在file2.php中有效,不应该对CSS和JS链接使用相同的方法。对/file2/something/CSS/base.CSS的请求不会被上述规则重写。因为如果第一个虚拟文件夹后面的路径部分包含/,则第二个规则条件中的第二个捕获不匹配。因此,我假设您没有真正使用上面的代码,而是更改了一些变体。